【零基础入门学习Python---Python的五大数据类型之字典类型】

news2024/11/14 11:27:04

一.Python的五大数据类型之字典类型

Python中的字典是一种无序的可变容器,可以存储任意数量的键值对。接下来我们就来学习一下五大数据类型之字典类型。

在这里插入图片描述

1.1 什么是字典

  1. 字典的键必须是唯一的,而值则可以是任意类型的对象,如字符串、数字、列表、元组等。字典的键是不可变类型,如字符串、数字、元组,而列表等可变类型则不能作为键。

  2. 字典的实现是通过哈希表实现的,因此查找、插入和删除操作的时间复杂度都是O(1)。

1.2 创建字典

创建字典的方式有多种,下面是其中两种常见的方式:

1.2.1 方式1:直接创建字典

# 直接创建字典
dict1 = {'name': 'Tom', 'age': 18, 'gender': 'male'}
print(dict1)  # 输出 {'name': 'Tom', 'age': 18, 'gender': 'male'}

1.2.2 方式2:使用dict()函数创建字典

dict2 = dict(name='Jerry', age=20, gender='female')
print(dict2)  # 输出 {'name': 'Jerry', 'age': 20, 'gender': 'female'}

1.3 字典的基本操作

1.3.1 添加元素

可以通过以下方式向字典中添加元素:

# 添加一个键值对
dict1['address'] = 'Beijing'
print(dict1)  # 输出 {'name': 'Tom', 'age': 18, 'gender': 'male', 'address': 'Beijing'}

# 更新一个键的值
dict1['age'] = 19
print(dict1)  # 输出 {'name': 'Tom', 'age': 19, 'gender': 'male', 'address': 'Beijing'}

# 批量添加元素
dict1.update({'email': 'tom@example.com', 'phone': '123456789'})
print(dict1)  # 输出 {'name': 'Tom', 'age': 19, 'gender': 'male', 'address': 'Beijing', 'email': 'tom@example.com', 'phone': '123456789'}

1.3.2 删除元素

可以通过以下方式从字典中删除元素:

# 删除一个键值对
del dict1['address']
print(dict1)  # 输出 {'name': 'Tom', 'age': 19, 'gender': 'male', 'email': 'tom@example.com', 'phone': '123456789'}

# 清空字典
dict1.clear()
print(dict1)  # 输出 {}

1.3.3 访问元素

可以通过键访问字典中的值:

dict1 = {'name': 'Tom', 'age': 18, 'gender': 'male'}
print(dict1['name'])  # 输出 Tom

需要注意的是,如果使用不存在的键来访问字典中的值,将会引发KeyError异常。可以使用get()方法来避免这种情况的发生,如果键不存在,则返回None或指定的默认值:

print(dict1.get('address'))  # 输出 None
print(dict1.get('address', 'unknown'))  # 输出 unknown

1.3.4 遍历字典

可以使用for循环继续遍历字典:

dict1 = {'name': 'Tom', 'age': 18, 'gender': 'male'}
# 遍历键
for key in dict1:
    print(key)

# 遍历值
for value in dict1.values():
    print(value)

# 遍历键值对
for key, value in dict1.items():
    print(key, value)

1.4 字典的基本方法

1.4.1 keys()

keys()方法返回字典中所有键的列表:

dict1 = {'name': 'Tom', 'age': 18, 'gender': 'male'}
print(dict1.keys())  # 输出 dict_keys(['name', 'age', 'gender'])

需要注意的是,keys()方法返回的是dict_keys类型的对象,而非列表类型,但是可以像列表一样使用。

1.4.2 values()

values()方法返回字典中所有值的列表:

dict1 = {'name': 'Tom', 'age': 18, 'gender': 'male'}
print(dict1.values())  # 输出 dict_values(['Tom', 18, 'male'])

同样,values()方法返回的是dict_values类型的对象,而非列表类型,但是可以像列表一样使用。

1.4.3 items()

items()方法返回字典中所有键值对的列表,每个键值对以元组的形式呈现:

dict1 = {'name': 'Tom', 'age': 18, 'gender': 'male'}
print(dict1.items())  # 输出 dict_items([('name', 'Tom'), ('age', 18), ('gender', 'male')])

同样,items()方法返回的是dict_items类型的对象,而非列表类型,但是可以像列表一样使用。

1.4.4 pop()

pop()方法可以从字典中删除指定的键值对,并返回对应的值,如果键不存在,则返回指定的默认值:

dict1 = {'name': 'Tom', 'age': 18, 'gender': 'male'}
value = dict1.pop('age')
print(value)  # 输出 18
print(dict1)  # 输出 {'name': 'Tom', 'gender': 'male'}

1.4.5 popitem()

popitem()方法可以随机删除字典中的一个键值对,并返回对应的键和值:

dict1 = {'name': 'Tom', 'age': 18, 'gender': 'male'}
key, value = dict1.popitem()
print(key, value)  # 输出 gender male
print(dict1)  # 输出 {'name': 'Tom', 'age': 18}

1.4.6 update()

update()方法可以将一个字典中的元素添加到另一个字典中,如果有相同的键,则用新字典中的值覆盖原字典中的值:

dict1 = {'name': 'Tom', 'age': 18, 'gender': 'male'}
dict2 = {'name': 'Jerry', 'email': 'jerry@example.com'}
dict1.update(dict2)
print(dict1)  # 输出{'name': 'Jerry', 'age': 18, 'gender': 'male', 'email': 'jerry@example.com'}

1.5 实操案例代码

1.5.1 案例一:统计字符串中每个字符出现的次数

def count_char(str1):
    char_dict = {}
    for char in str1:
        if char in char_dict:
            char_dict[char] += 1
        else:
            char_dict[char] = 1
    return char_dict

str1 = 'hello, world!'
print(count_char(str1))
# 输出 {'h': 1, 'e': 1, 'l': 3, 'o': 2, ',': 1, ' ': 1, 'w': 1, 'r': 1, 'd': 1, '!': 1}

1.5.2 案例二:合并多个字典

dict1 = {'name': 'Tom', 'age': 18}
dict2 = {'gender': 'Male'}
dict3 = {'email': 'tom@example.com'}

dict4 = {}
for d in (dict1, dict2, dict3):
    dict4.update(d)

print(dict4)
# 输出 {'name': 'Tom', 'age': 18, 'gender': 'Male', 'email': 'tom@example.com'}

1.5.3 案例三:根据字典中的值对字典排序

def sort_dict(dict1):
    dict2 = {k: v for k, v in sorted(dict1.items(), key=lambda item: item[1])}
    return dict2

dict1 = {'Tom': 75, 'Jerry': 90, 'Alice': 80, 'Bob': 85}
print(sort_dict(dict1))
# 输出 {'Tom': 75, 'Alice': 80, 'Bob': 85, 'Jerry': 90}

1.5.4 将列表转换为字典

keys = ['name', 'age', 'gender']
values = ['Tom', 18, 'Male']

dict1 = dict(zip(keys, values))

print(dict1)
# 输出 {'name': 'Tom', 'age': 18, 'gender': 'Male'}

1.5.5 使用字典实现一个简单的缓存

def fibonacci(n):
    if n in cache:
        return cache[n]

    if n < 2:
        result = n
    else:
        result = fibonacci(n - 1) + fibonacci(n - 2)

    cache[n] = result
    return result

1.6 字典的排序方法,升序以及降序

对于字典的排序,可以使用内置的 sorted() 函数或 sorted() 方法来实现,也可以使用 collections.OrderedDict 类来保持排序顺序。

下面分别介绍这些方法的升序和降序排序。

1.6.1 使用内置函数 sorted() 进行排序

使用内置函数 sorted() 可以对字典进行排序。默认情况下,sorted() 按照字典中的键进行升序排序。可以使用 reverse=True 参数来实现降序排序。

# 升序排序
d = {'b': 2, 'a': 1, 'c': 3}
sorted_d = sorted(d.items())
print(sorted_d)  # [('a', 1), ('b', 2), ('c', 3)]

# 降序排序
sorted_d_desc = sorted(d.items(), reverse=True)
print(sorted_d_desc)  # [('c', 3), ('b', 2), ('a', 1)]


1.6.2 使用字典的 sorted() 方法进行排序

使用字典的 sorted() 方法可以按照字典中的键或值进行排序。与 sorted() 函数一样,该方法默认按照字典中的键进行升序排序,并且可以使用 reverse=True 参数来实现降序排序。

# 升序排序
d = {'b': 2, 'a': 1, 'c': 3}
sorted_d = sorted(d.items())
print(sorted_d)  # [('a', 1), ('b', 2), ('c', 3)]

# 按值进行排序
sorted_d_value = sorted(d.items(), key=lambda x: x[1])
print(sorted_d_value)  # [('a', 1), ('b', 2), ('c', 3)]

# 降序排序
sorted_d_desc = sorted(d.items(), key=lambda x: x[0], reverse=True)
print(sorted_d_desc)  # [('c', 3), ('b', 2), ('a', 1)]

1.6.3 使用 collections.OrderedDict 类进行排序

collections.OrderedDict 类可以保持字典中元素的插入顺序,并且支持排序功能。默认情况下,OrderedDict 按照字典中的键进行升序排序。可以使用 reverse=True 参数来实现降序排序。

from collections import OrderedDict

# 升序排序
d = {'b': 2, 'a': 1, 'c': 3}
sorted_d = OrderedDict(sorted(d.items()))
print(sorted_d)  # OrderedDict([('a', 1), ('b', 2), ('c', 3)])

# 按值进行排序
sorted_d_value = OrderedDict(sorted(d.items(), key=lambda x: x[1]))
print(sorted_d_value)  # OrderedDict([('a', 1), ('b', 2), ('c', 3)])

# 降序排序
sorted_d_desc = OrderedDict(sorted(d.items(), key=lambda x: x[0], reverse=True))
print(sorted_d_desc)  # OrderedDict([('c', 3), ('b', 2), ('a', 1)])

二.注意事项

  1. 字典的键必须是可哈希的,也就是说,键必须是不可变的类型,比如数字、字符串、元组等,而列表和字典等可变类型是不可以作为键的。

  2. 字典是无序的,如果需要有序的字典,可以使用collections模块中的OrderedDict类。

  3. 在Python3中,keys()、values()、items()等方法返回的不再是列表类型,而是dict_keys、dict_values、dict_items类型的对象,但是可以像列表一样使用。

  4. 字典的遍历顺序可能会随机变化,因此在遍历时需要注意顺序的问题。

  5. 字典的操作是原地修改,也就是说,对字典进行的任何修改都会影响原始的字典,因此在进行操作时需要注意备份的问题。

三.总结

  1. 总的来说,Python中的字典类型是一种非常有用的数据类型,可以用来存储键值对,其基本用法和列表、元组等数据类型类似,但是字典的键值对是无序的,且键必须是不可变类型。

  2. 字典类型的基本用法包括创建字典、访问字典中的元素、修改字典中的元素、删除字典中的元素等操作。另外,字典类型也提供了一些基本的方法,如keys()、values()、items()等,可以用来访问字典中的键、值、键值对等。

  3. 字典类型也有一些高级用法,如遍历字典、合并多个字典、将列表转换为字典、使用字典实现一个简单的缓存等操作,这些操作可以帮助我们更好地利用字典类型来解决实际问题。

  4. 在使用字典类型时,需要注意字典是无序的,键必须是不可变类型,同时还要注意避免使用不恰当的键或值类型、重复的键等问题。

  5. 此外,在使用字典类型时,还需要注意一些性能问题。由于字典类型使用哈希表来实现,所以在访问字典中的元素时,其速度是非常快的,但是在插入和删除元素时,由于哈希表的重新哈希和扩容等操作,可能会导致性能下降。因此,在需要频繁插入和删除元素的情况下,应该考虑使用其他数据类型来替代字典类型。

  6. 最后,需要注意的是,字典类型虽然非常灵活和方便,但是在处理大量数据时可能会导致内存占用过大的问题。因此,在需要处理大量数据时,需要谨慎使用字典类型,并尽可能地使用一些高效的算法和数据结构来减少内存占用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/683378.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2.6C++虚基类

C 虚基类概述 C虚基类是一种特殊的基类&#xff0c;用于解决多重继承中的菱形继承问题。 虚基类通过共享基类的成员来解决这个问题。 在定义虚基类时&#xff0c;需要在基类名前加上关键字 virtual 。 虚基类的初始化和普通基类的初始化有些不同&#xff0c;因为虚基类的构…

4.salesforce权限相关

salesforce权限相关 一&#xff0c;控制用户访问权限1.Levels of Data Access&#xff08;数据访问权限级别&#xff09;1. 组织&#xff08;Organization&#xff09;级别2. 对象&#xff08;Objects&#xff09;级别3. 字段&#xff08;Fields&#xff09;级别4. 记录&#x…

【IMX6ULL驱动开发学习】11.驱动设计之面向对象_分层思想(学习设备树过渡部分)

一个可移植性好的驱动程序&#xff0c;应该有三个部分组成 1、驱动框架程序&#xff08;xxx_drv.c&#xff09; — 对接应用层的 open read write 函数&#xff0c;不做GPIO具体操作 2、硬件操作程序&#xff08;xxx_chip_gpio.c&#xff09;— 执行具体的GPIO操作&#xff0c;…

传输层解析

目录 传输层解析 传输层概述 传输层的作用 传输层的协议 TCP协议概述 UDP协议概述 TCP协议 TCP的封装格式 TCP的连接与断开 TCP的流控与差错控制 TCP的计时器 TCP的应用 UDP协议 UDP的封装格式 UDP的应用 UDP的流程与差错控制 传输层解析 传输层概述 传输层的…

一招搞定电脑提示“由于找不到XINPUT1_3.dll,无法继续执行代码”问题

玩游戏或者运行程序软件的时候&#xff0c;电脑提示“由于找不到XINPUT1_3.dll&#xff0c;无法继续执行代码”是怎么回事呢&#xff1f;其实xinput1_3.dll是Windows操作系统中的一个动态链接库文件&#xff0c;它是DirectX API的一部分&#xff0c;用于提供对输入设备的支持&a…

CSS之定位

作用&#xff1a;灵活的改变盒子在网页中的位置 实现&#xff1a; 1.定位模式&#xff1a;position 2.边偏移&#xff1a;设置盒子的位置 leftrighttopbottom 相对定位 position: relative 特点&#xff1a; 不脱标&#xff0c;占用自己原来位置显示模式特点保持不变设…

【Python】异常处理 ⑤ ( 异常传递 | 异常处理顺序 | 代码示例 )

文章目录 一、Python 异常传递1、异常传递性2、代码示例 - 异常传递性3、代码示例 - 在指定位置处理异常 一、Python 异常传递 1、异常传递性 在 Python 中 , 异常是具有传递性的 , 该特性是 Python 中的一个重要特性 , 它使得代码更加健壮和可靠 ; 异常传递 指的是 在代码中捕…

提高办公效率用什么?表单开发工具好不好用?

在办公流程化繁盛发展的今天&#xff0c;越来越多的企业希望通过专业的软件和工具提升办公协作效率&#xff0c;朝着数字化和流程化管理的方向靠近。那么&#xff0c;如何提高办公效率&#xff1f;如何提高表格制作质量和效率&#xff1f;表单开发工具是专业的办公软件平台之一…

ORACLE透明网关ODBC连接MYSQL

客户需求oracle访问mysql数据&#xff0c;客户是linux7.3 11.2.0.4单实例&#xff0c;字符集GBK&#xff0c;mysql是5.7.31&#xff0c;字符集UTF8&#xff0c;下面结合网上的文档和自己的实践&#xff0c;配置过程如下 1.安装oracle透明网关 首先在oracle服务器上面安装ora…

【看完就会】Jmeter接口测试之断言详解

什么是断言&#xff1f; 断言&#xff0c;这是一个软件术语&#xff0c;简单来说&#xff0c;就是依靠软件程序自动判断操作结果的正确性。在接口测试中&#xff0c;这里的断言就是判断接口请求是否符合预期&#xff0c;从而判断接口用例是否执行通过。 你应该也听过一个概念…

【JS经验分享】你真的会写JS吗?满满干货,建议读三遍(1)

大家好&#xff0c;最近准备总结一下JS的经验&#xff0c;分享分享&#xff0c;有不对的欢迎讨论哈~ JS作为前端的基础技能&#xff0c;每一位前端开发都要运用熟练&#xff0c;但你真的会写JS吗&#xff1f;js全称JavaScript&#xff0c;是运行在浏览器上的脚本语言&#xff0…

SAP MM 物料主数据配置

物料主数据的管理不仅仅需要引起MM顾问的重视&#xff0c;同样也需要SAP的客户足够重视。 在SAP的实施过程中。客户通常需要将一个或多个历史系统的数据根据规则转换成SAP的主数据 一个实施项目的成功与否的基本就是&#xff0c;数据是否被正确的导入 1.配置一个新的物料类型…

三个美观的个人博客网站源码

怎么让源码更适合你&#xff1f;改造&#xff01; 名称&#xff1a; 二开版UI漂亮的PHP博客论坛网站源码 介绍&#xff1a;可切换皮肤界面 下载&#xff1a;https://wwwf.lanzout.com/ihLNM10bfgnc 二、名称&#xff1a;Emlog Pro博客管理系统源码绿色版下载 介绍&#xff1…

【模拟CMOS集成电路设计】带隙基准(Bandgap)设计与仿真

【模拟CMOS集成电路设计】带隙基准&#xff08;Bandgap&#xff09;设计与仿真 前言一、 设计指标二、 电路分析三、 仿真测试3.1测试电路图3.2测试结果(1)基准温度系数仿真(2)瞬态启动仿真(3)静态电流仿真(4)线性调整率仿真(5)电源抑制PSR仿真 四、测试结果五、总结附录MOS器件…

地埋式积水监测系统在城市道路中的应用

伴随着汛期的到来&#xff0c;多地遭到大雨及暴雨的袭击&#xff0c;导致城市内涝现象频繁发生&#xff0c;使整个城市陷入瘫痪状态&#xff1b;交通道路受阻&#xff0c;严重影响了市民的生活&#xff0c;国家有关部门也因此出台了不少相关防涝政策。 积水监测系统可以加强城…

《WebGIS快速开发教程第二版》完成修订了

端午节过后各位小伙伴可能也要慢慢回归工作了&#xff0c;尽管不想工作不想烧脑但是没有办法&#xff0c;该干的活一样也少不了是吧&#x1f92a;。 趁着空闲时间我完成了《WebGIS快速开发教程》这本书 的修改工作。相对于第一版&#xff0c;第二版进行了如下改动&#xff1a;…

加密与解密 调试篇 静态分析技术 (三)枚举/IDC/插件

目录 1.枚举类型 2.FLIRT 1.应用FLIRT签名 3.IDC脚本 IDC分析加密代码 4.插件 5.IDA调试器 1.加载目标文件 2.调试器界面 ​编辑 3.调试跟踪 4.断点 5.跟踪 1.枚举类型 这是一段c语言源代码 #include <stdio.h> int main(void) {enum weekday { MONDAY, TUE…

Redis入门(6)-ZSet

Redis中的Zset是有序的、可重复的&#xff08;元素不能重但score可重&#xff09;&#xff0c;其中每个元素都有一个分值score&#xff0c;Redis会根据其score对其进行从小到大的排序。 1.zadd key score member [score member] 添加元素 zadd subject 3 JAVA 2 C 1 mysql…

操作系统——磁盘调度算法的模拟与实现

一、实验题目 磁盘调度算法的模拟与实现 二、实验目的 (1) 了解磁盘结构以及磁盘上数据的组织方式。 (2) 掌握磁盘访问时间的计算方式。 (3) 掌握常用磁盘调度算法及其相关特性。 三、总体设计&#xff08;含背景知识或基本原理与算法、或模块介绍、设计步骤等&#xf…

计算机网络--网络编程(1)

简单认识一下传输层中的UDP和TCP&#xff1a; TCP&#xff1a;有链接&#xff0c;可靠传输&#xff0c;面向字节流&#xff0c;全双工 UDP&#xff1a;无连接&#xff0c;不可靠传输&#xff0c;面向数据报&#xff0c;全双工 有链接类似于打电话&#xff0c;通了就是有链接。…