Python进阶篇之字典操作总结
|
一、与字典值有关的计算 问题 想对字典的值进行相关计算,例如找出字典里对应值最大(最小)的项。 解决方案一: 假设要从字典 {'a':3,'b':2,'c':6} 中找出值最小的项,可以这样做:
>>> d = {'a':3,'c':6}
>>> min(zip(d.values(),d.keys()))
(2,'b')
值得注意的是 d.values() 获取字典的全部值, 解决方案二: 除了使用
>>> d = {'a':3,'c':6}
>>> min((v,k) for (k,v) in d.items())
(2,'b')
这里 min 函数的参数 二、字典推导式 问题 想把一个元组列表转换成一个字典,例如把 解决方案 类似于列表推导式,字典推导式可以方便地从其他数据结构构造字典,例如:
>>> l = [('a',3)]
>>> {k: v for k,v in l}
{'c': 3,'a': 1}
字典推导式的规则和列表推导式一样,只是把 [] 换成 {} 三、寻找字典的交集 问题 假设有两个字典:
d1 = {'a':1,'c':3,'d':4}
d2 = {'b':2,'d':3,'e':5}
要找出这两个字典中具有公共键的项,即要得到结果 {'b':2,'c':3} 解决方案 我们知道一般通过
>>> dict(d1.items() & d2.items()) # 取交集
{'b': 2,'c': 3}
此外,
>>> { k:d1[k] for k in d1.keys() & d2.keys() }
{'b': 2,'d': 4,'c': 3}
这里如果相同的键对应不同的值则去第一个字典中的值。推广开来,如果想排除掉字典中的某些键,可以这样:
>>> { k:d1[k] for k in d1.keys() - {'c','d'} } # - 号的含义是集合的差集操作
{'b': 2,'a': 1}
但有一点需要注意的是, 四、多个字典连接成一个字典 问题 有多个字典,例如:
d1 = {'a':1,'c':3}
d2 = {'c':4,'d':5,'e':6}
想将这多个字典连接为一个字典,或一次性对多个字典进行迭代操作。 解决方案 使用
>>> from collections import ChainMap
>>> chain_dict = ChainMap(d1,d2)
>>> for k,v in chain_dict.items():
print(k,v)
a 1
e 6
d 5
c 3
b 2
ChainMap 将传入的多个字典连接为一个字典,并返回一个 ChainMap 对象,这个对象的行为就像一个单一的字典,我们可以对其进行取值或者迭代等操作。注意到这里键 c 对应的值为 3,如果传入 ChainMap 的字典含有相同的键,则对应的值为先传入的字典中的值。 此外,如果你只想单纯地迭代字典的键值对,可以结合使用 >>> from itertools import chain >>> for k,v in chain(d1.items(),d2.items()): print(k,v) a 1 c 3 b 2 e 6 c 4 d 5 这里相同的键会被分别迭代出来。 五、保持字典有序 问题 想让字典中元素的迭代顺序和其加入字典的顺序保持一致 解决方案 通常来说,使用 >>> d = dict() >>> d['a'] = 1 >>> d['b'] = 2 >>> d['c'] = 3 >>> for k,v in d.items(): print(k,v) a 1 c 3 b 2 每一次运行结果都可能不同。如果想让元素迭代的顺序和创建字典时元素的顺序一致,就要使用 >>> from collections import OrderedDict >>> ordered_d = OrderedDict() >>> ordered_d['a'] = 1 >>> ordered_d['b'] = 2 >>> ordered_d['c'] = 3 >>> for k,v in ordered_d.items(): print(k,v) a 1 b 2 c 3 OrderedDict 实际通过维护一个双向链表来记录元素添加的顺序,因此其耗费的内存大约为普通字典的两倍。所以在实际使用中需综合考虑各种因素来决定是否使用 OrderedDict 。 六、使字典的键映射多个值 问题 通常情况下字典的键只对应一个值。现在想让一个键对应多个值。 解决方案 为了使一个键对应多个值,首先需要把多个值放到一个容器中(例如列表或者集合等)。例如有这样一个列表:
>>> from pprint import pprint
>>> l = [('a',5)]
>>> d = {}
>>> for k,v in l:
if k in d:
d[k].append(v)
else:
d[k] = [v]
>>> pprint(d)
{'a': [1,2],'b': [3,4],'c': [5]}
但是
>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> for k,v in l:
d[k].append(v)
>>> pprint(d)
defaultdict(<class 'list'>,{'c': [5],'a': [1,2]})
defaultdict 是 dict 的一个子类。对 dict 来说,如果 key 不存在,则 dict[key] 取值操作会抛出 KeyError 异常,但是 defaultdict 则会返回一个传入 defaultdict 构造器的类的实例(例如一个列表)或者自定义的缺失值。因此在上例中,对于 传入 defualtdict 构造器的值不一定要是一个类,也可以是一个可调用的函数,当相应的键不在 defualtdict 中时,其默认的值就为这个函数的返回值,例如: >>> from collections import defaultdict >>> def zero_default(): return 0 >>> d = defaultdict(zero_default) >>> d['a'] = 1 >>> d['a'] 1 >>> d['b'] 0 >>> d.keys() dict_keys(['b','a']) >>> 利用这样一个特性,我们可以构造无限深度的字典结构:
>>> from collections import defaultdict
>>> import json
>>> tree = lambda: defaultdict(tree)
>>> d = tree()
>>> d['a']['b'] = 1
>>> print(json.dumps(d)) # 为了显示的格式更好看
{"a": {"b": 1}}
这里当执行 d['a'] 时,由于相应的键不存在,故返回一个 总结 以上就是这篇文中的全部内容,希望本文的内容对大家学习或者使用python能有一定的帮助,如果有疑问大家可以留言交流。 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
