- 字典是可迭代的、可变的数据结构,通过键来访问元素。
- 字典中的元素是无序的,因为底层使用hash。字典中键要求唯一,值可以重复。字典当中的键要求是不可变序列(如元组、字符串、整数和浮点数等)。
- 字典也属于序列,即序列中的方法字典都可以使用。
- 字典由两部分组成,键和值,其中,键不可重复,值可以重复。
如下为字典结构的例子:
键(key) | 值(value) |
---|---|
中国 | China |
美国 | America |
创建字典
方法一:使用大括号 {} 包裹键值对创建字典,键 和 值 之间用冒号分隔,两个键值对之间用逗号分隔。
方法二:用dict()函数,其参数可以是字典、元组、列表。
输入下面代码
a = {} #创建一个空字典
print(type(a))
b = { 1:'张三',2:'李四',3:'王五'} #使用大括号创建一个字典
print(b)
c = { 1:'张三',2:'李四',3:'王五',1:'我是张三' } #由于字典中键不能重复,当有两个相同名字的键时
print(c) #后面的键的值会覆盖前面的
print(c[1]) #输出字典中键为 1 的值
print("分割线---------------")
a1 = dict(a) #参数可以是其它字典对象
print(a1)
a1 = dict(((1,'张三'),(2,'李四'),(3,'王五'))) #参数也可以是元组
a2 = dict([(1,'张三'),(2,'李四'),(3,'王五')]) #参数也可以是列表
print(a1)
print(a2)
a3 = dict(zip([1,2],['张三','李四'])) #也可以使用zip()函数,将可迭代对象打包成元组
# 它会将两个括号中的元素对应在一起,前面的是键,后面的是值
print(a3)
t1 = (1,'张三')
t2 = (2,'李四')
t3 = (3,'王五')
t = (t1,t2,t3)
a4 = dict(t)
print(a4)
代码运行结果
<class 'dict'>
{1: '张三', 2: '李四', 3: '王五'}
{1: '我是张三', 2: '李四', 3: '王五'}
我是张三
分割线---------------
{}
{1: '张三', 2: '李四', 3: '王五'}
{1: '张三', 2: '李四', 3: '王五'}
{1: '张三', 2: '李四'}
{1: '张三', 2: '李四', 3: '王五'}
可以看到使用这些方式有的比较复杂,推荐使用大括号的方式创建字典。
删除字典
基本语法格式如下
del 字典名
修改字典
修改字典包括添加、替换和删除键值对,其中访问字典可以通过下标实现,下标参数为对应的键,返回键对应的值。
输入下面代码
a = { 1:'张三',2:'李四',3:'王五'}
a[1] = '我是张三' #修改键值对(键存在)
print(a)
a[4] = '赵六' #此时没有 4 这个键时,该效果为添加键值对
print(a)
del a[4] #删除键值对,若要删除的键值对不存在则会抛出错误
print(a)
b = a.pop(3) #删除键值对,若要删除的键值对不存在则会返回默认值(default)
print(a)
print(b) #返回删除的值
c = a.popitem() #可以删除任意键值对,返回删除的键值对构成元组
print(a)
print(c) #返回删除的值
代码运行结果
{1: '我是张三', 2: '李四', 3: '王五'}
{1: '我是张三', 2: '李四', 3: '王五', 4: '赵六'}
{1: '我是张三', 2: '李四', 3: '王五'}
{1: '我是张三', 2: '李四'}
王五
{1: '我是张三'}
(2, '李四')
访问字典
方法名 | 描述 |
---|---|
d[i] | 其中d为字典,i为键;如果字典中没有key则会报错。 |
get(key[,vlues]) | 获取key对应的值;如果字典中没有key则会返回value;如果字典中没有key也没有value则会返回None |
items() | 返回字典所有的键值对 |
keys() | 返回字典键视图 |
values() | 返回字典值视图 |
in 和 not in 运算符 | 只能测试键视图是否包含特定元素 |
pop(key,default) | key存在则获取相应的value,同时删除key-value对,否则获取默认值 |
popitem() | 随机从字典中取出一个key-value对,结果为元组类型,同时将key-value从字典中删除 |
clear() | 清空字典中所有的key-vaue对 |
输入下面代码
a = { 1:'张三',2:'李四',3:'王五'}
print(a.get(1))
print(a.get(4,'字典中没有 4 这个键就会出现我'))
print(a.keys())
print(a.values())
print(a.items())
print(3 in a)
print('张三' in a)
代码运行结果
张三
字典中没有 4 这个键就会出现我
dict_keys([1, 2, 3])
dict_values(['张三', '李四', '王五'])
dict_items([(1, '张三'), (2, '李四'), (3, '王五')])
True
False
如果想得到指定格式的字典,可以结合list或tuple函数实现
示例代码如下
dict1 = {'张三':3,'李四':4,'王五':5}
# 获取字典中所有的键
x1 = dict1.keys()
print(x1)
# 获取字典中所有的值
x2 = dict1.values()
print(x2)
# 获取字典中所有的键值对
x3 = dict1.items()
print(x3)
# 也可以先将字典中的数据转成key-value的形式,再以元组的方式进行展示
x4 = list(dict1.items()) # 列表
print(x4)
x5 = tuple(dict1.items()) # 元组
print(x5)
代码运行结果
dict_keys(['张三', '李四', '王五'])
dict_values([3, 4, 5])
dict_items([('张三', 3), ('李四', 4), ('王五', 5)])
[('张三', 3), ('李四', 4), ('王五', 5)]
(('张三', 3), ('李四', 4), ('王五', 5))
Process finished with exit code 0
遍历字典
由于字典既有键视图,也有值视图,因此遍历时可以只遍历键视图,也可以只遍历值视图,也可以同时遍历。遍历可以通过 for 循环来实现
输入下面代码
a = { 1:'张三',2:'李四',3:'王五'}
for key in a.keys():
print("我的键是:{0}".format(key))
print("分割线--------------")
for value in a.values():
print("我的值是:{0}".format(value))
print("分割线--------------")
for key,value in a.items():
print("我的键是:{0},我的值是{1}".format(key,value))
代码运行结果
我的键是:1
我的键是:2
我的键是:3
分割线--------------
我的值是:张三
我的值是:李四
我的值是:王五
分割线--------------
我的键是:1,我的值是张三
我的键是:2,我的值是李四
我的键是:3,我的值是王五
字典合并运算符 |
示例代码如下
A = {'name':'CSDN@邂逅自己'}
B = {'require':'点赞关注+打赏'}
C = A|B
print(A)
print('-'*30)
print(B)
print('-'*30)
print(C)
代码运行结果
{'name': 'CSDN@邂逅自己'}
------------------------------
{'require': '点赞关注+打赏'}
------------------------------
{'name': 'CSDN@邂逅自己', 'require': '点赞关注+打赏'}
Process finished with exit code 0
同步迭代
示例代码如下
score = ['A','B','C','D'] # 若score数据类型为列表,则会输出所有结果;若score数据类型为集合,则可能输出结果为1~2个,因为集合是无序的
counts = [1,2,3,4]
for s,c in zip(score,counts):
match s,c:
case 'A',1:
print('1个同学成绩为A')
case 'B',2:
print('2个同学成绩为B')
case 'C',3:
print('3个同学成绩为C')
case 'D',4:
print('4个同学成绩为D')
代码运行结果
1个同学成绩为A
2个同学成绩为B
3个同学成绩为C
4个同学成绩为D
Process finished with exit code 0
字典生成式
基本格式如下
d = { key:value for items in range }
d = { key:value for items in zip(lst1,lst2) }
# 关键是要分清谁作为key、谁作为value
示例代码如下
import random
dict1 = {item:random.randint(10,20) for item in range(1,6)}
print(dict1)
list1 = [1,2,3,4]
list2 = ['张三','李四','王五','赵六']
dict2 = {index:item for index,item in zip(list1,list2)}
print(dict2)
代码运行结果
{1: 10, 2: 19, 3: 15, 4: 13, 5: 15}
{1: '张三', 2: '李四', 3: '王五', 4: '赵六'}
Process finished with exit code 0
字典推导式
基本格式如下:
{ key: value for key,value in b.items() if value%2 == 0}
其中b为某个字典对象
注意:这只是示例,在该例子中字典的值视图假定为数字,才能用后面的 if 条件来筛选
输入下面代码
a = {1:10,2:20,3:33,4:44,5:66,6:55}
b = {k:v for k,v in a.items()}
print(b)
#下面为增加if作为筛选条件的结果
c = {k:v for k,v in a.items() if v%2 == 0}
print(c)
#推导式中也可以只有键
d = {k for k in a.keys() if k%2 == 0}
print(d)
#推导式中也可以只有值
e = {v for v in a.values() if v%2 == 0}
print(e)
代码运行结果
{1: 10, 2: 20, 3: 33, 4: 44, 5: 66, 6: 55}
{1: 10, 2: 20, 4: 44, 5: 66}
{2, 4, 6}
{10, 20, 66, 44}
如果想要系统的学习Python知识,可以点开我的主页,点击专栏“Python零基础从入门到实战”进行学习。
最后,文章创作不易(本文前后经过多次修改,只为了给大家最好的学习教程),如果觉得文章对大家有帮助的话,还请点赞+关注;如果有能力的话,也可以打赏一下喔,谢谢大家!!!