Python碎片日记06——字典:创建方法、常用方法、字典视图、判断key是否存在、key的排序;迭代协议(简述)

本文介绍了Python字典的创建方法,包括通过键赋值来创建;详细阐述了字典的常用方法,如视图(items(), keys(), values())及其特性;讲解了如何判断字典中key的存在,提供了in运算符、get方法和异常处理等方法;讨论了字典key的排序问题,并推荐使用sorted()函数;最后,简要说明了迭代协议在字典操作中的应用。" 136508726,22182419,华为OD机试:代表团坐车问题的Java解法,"['Java', '数据结构', '算法', '华为面试']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

字典

创建方法

与列表中禁止边界外的赋值不同,对一个新的字典的键赋值会创建该键:(字典的键可以是不可变对象或带合适协议(确保其值不变)的类实例对象,对于列表和字典则不可作为键)

#方法一:创建空字典,再逐个添加
D = {}
D['name'] = 'Bob'
D.update(D2)#合并其他字典,如果D2中有和D相同的键,则其值会覆盖D中该键对应的值
#方法二:使用fromkeys创建key,适用于多个键有相同值的创建
D=dict.fromkeys(['a','b']) #{'a': None, 'b': None}
D=dict.fromkeys(['a','b'],0) #{'a': 0, 'b': 0}
#方法三:使用zip配对
keyslist=[1,2,3]
valslist=['a','b','c']
D=dict(zip(keyslist,valslist)) #{1: 'a', 2: 'b', 3: 'c'}
D={k:v for (k,v) in zip(keyslist,valslist)}#{1: 'a', 2: 'b', 3: 'c'}
keyslist=[2,2,2,3]#当keys有重复项时,后一个会覆盖前一个
valslist=['a','b','c'] # 和keys数量不一致时,多余的keys或values会被忽略
D=dict(zip(keyslist,valslist)) #{2: 'c'}
#方法四:直接赋值转换(此时注意key的形式会受到限制)
D=dict(name='a',age='f') #{'name': 'a', 'age': 'f'}注意,此处的name、age换成数字key会报错
#方法五:利用键值元组建立字典
D=dict([('name','dd'),('gdfg','jjj')])# {'name': 'dd', 'gdfg': 'jjj'}

常用方法

D.copy()
D.pop(key)#删除一项
del D[key]#删除一项
list(D.keys())#字典视图
D = {x: x*2 for x in range(10)}# 字典解析

字典视图

字典视图可迭代、保持字典成分最初的顺序、反映字典未来的修改、支持集合操作、打印时不显示自己的项、不支持索引和sorted,主要有三个:

D.items()
D.keys()
D.values()

因为key是值唯一的,所以items()与keys()视图支持与set对象(或字典对象,只不过有用的部分仍是字典的key)的交集并集等集合操作,返回的结果是集合形式:

D={'a':1, 'b':2, 'c':3}
D1={'b':2}
##对于keys()
k=D.keys()
k|{'x':4} #{'a', 'b', 'c', 'x'}
k|{'x'} #{'a', 'b', 'c', 'x'}
k&D1.keys() #{'b'}
k&{'b'} #{'b'}
k&{'b':2} #{'b'}

##对于items()
I=D.items()
I|D #{('a', 1), ('b', 2), ('c', 3), 'a', 'b', 'c'}
I|k #{('a', 1), ('b', 2), ('c', 3), 'a', 'b', 'c'}
I|{('x',4)} #{('a', 1), ('b', 2), ('c', 3), ('x', 4)}
I&{('a', 1)} #{('a', 1)}

其中,关于字典视图对象的‘“反映字典未来的修改”,指的是在创立视图对象后,随着字典的改变,视图对象自动随之发生变化:

D={'a':1, 'b':2, 'c':3}
k=D.keys()
I=D.items()
V=D.values()
list(k) #['a', 'b', 'c']
list(I) #[('a', 1), ('b', 2), ('c', 3)]
list(V) #[1, 2, 3]
del D['a']
list(k) #['b', 'c']
list(I) #[('b', 2), ('c', 3)]
list(V) #[2, 3]

判断key是否存在

尽管字典可以对新的键赋值以扩展字典,但是对不存在的键进行获取内容,会出现错误。为判断某个key是否在字典中,可以用以下方法:

  1. in关系表达式进行查询(此语句只能搜索key):
'f' in D # 会输出True或者False
if not 'f' in D:
	print('missing')
  1. get方法:
value = D.get('x',0) #如果x不在D的key中,则value=0
  1. if/else表达式:
value = D['x'] if 'x' in D else 0
  1. try语句
  2. Python2中还有has_key方法

key的排序

字典的内容是没有顺序的(实际上在存储中是散列排序的),如果想要强调某种顺序,常用的方法是将所有键放在一个列表中,再用sort()排序

D = {'A':1, 'B':2, 'C':3}
Ks = list(D.keys())
Ks.sort()
for key in ks: #迭代器遍历
	print(key,'=>', D[key])

在新版本中,sorted()函数可以简化以上步骤:

for key in sorted(D):
	print(key,'=>', D[key])

迭代协议

这是Python中无处不在的一个概念,表示在内存中物理存储的序列,或一个在迭代操作情况下每次产生一个元素的对象。从左向右扫描一个对象的每个Python工具都使用迭代协议。因此在上面sorted(D)中,sorted调用直接工作于字典值上。
for、while、列表解析等都遵循迭代协议,但列表解析和相关的函数编程工具,如map和filter,通常运行得比for循环快(也许快了两倍)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值