总结了一些关于字典的小技巧或者注意的地方。
创建字典有以下三种方法
dict(a=1, b=2, c=2) dict([(a,1), (b,2), (c,3)]) dict({a:1, b:2, c:3})
推荐使用第二种方法结合zip创建
key = 'abcde' value = range(1, 6) dict(zip(key, value))
d = dict(a=1, b=2, c=3) for k, v in d.iteritems(): print k, v # a 1 # c 3 # b 2
当然也可以使用items来遍历字典, 与之不同的是iteritems返回一个迭代器。
d = dict(a=1, b=2, c=3) for k, v in d.items(): print k, v # a 1 # c 3 # b 2
In [69]: d.iteritems() Out[69]: <dictionary-itemiterator at 0x3f216d8> In [70]: d.items() Out[70]: [('a', 1), ('c', 3), ('b', 2)]
首先,dict[key] 与 delete dict[key]也可以获取/删除key。但是key不存在时,会引发 KeyError 异常。为了避免引发异常可以使用get和带defaut参数的pop
合并两个字典可以先把两个字典分成key-value对,再连接两个key-value对,生成新的字典。即 dict(dict1.items()+dict2.items())
。不过效率有些低。
使用效率更高的 dict(dict1, **dict2)
连接两个字典。
In [29]: dict1 Out[29]: {'a': 1, 'b': 2, 'c': 3} In [30]: dict2 Out[30]: {'d': 4, 'e': 5, 'f': 6} In [31]: dict(dict1, **dict2) Out[31]: {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6}
$ python -m timeit -s 'dict1=dict2=dict(a=1,b=2)' 'dict3=dict(dict1,**dict2)' 1000000 loops, best of 3: 0.573 usec per loop $ python -m timeit -s 'dict1=dict2=dict(a=1,b=2)' 'dict3=dict(dict1.items()+dict2.items())' 100000 loops, best of 3: 2.21 usec per loop
dict.copy()是一个浅拷贝,当遇到字典或者列表时,将不能完全拷贝。使用copy模块的deepcopy()方法。
import copy dict1 = {'a': [1, 2], 'b': 3} dict2 = dict1 dict3 = dict1.copy() dict4 = copy.deepcopy(dict1) dict1['b'] = 'change' dict1['a'].append('change') print dict1 # {'a': [1, 2, 'change'], 'b': 'change'} print dict2 # {'a': [1, 2, 'change'], 'b': 'change'} print dict3 # {'a': [1, 2, 'change'], 'b': 3} print dict4 # {'a': [1, 2], 'b': 3}