字典
创建方法
与列表中禁止边界外的赋值不同,对一个新的字典的键赋值会创建该键:(字典的键可以是不可变对象或带合适协议(确保其值不变)的类实例对象,对于列表和字典则不可作为键)
#方法一:创建空字典,再逐个添加
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是否在字典中,可以用以下方法:
- in关系表达式进行查询(此语句只能搜索key):
'f' in D # 会输出True或者False
if not 'f' in D:
print('missing')
- get方法:
value = D.get('x',0) #如果x不在D的key中,则value=0
- if/else表达式:
value = D['x'] if 'x' in D else 0
- try语句
- 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循环快(也许快了两倍)。