## 一个键映射多个值,将元素对转换为 d = {'a': [1,2,3,4], 'b': [5,6,7,8]}
# 普通方法
1 pairs = [('a', 1),('b', 5),('a', 4),('a', 3),('b', 8),('b', 6),('a', 2),('b', 7),] 2 d = {} 3 for k, v in pairs: 4 if k not in d: # 若key不存在,则手动创建 5 d[k] = [] 6 d[k].append(v) 7 8 print(d) 9 # {'a': [1, 4, 3, 2], 'b': [5, 8, 6, 7]}
# 使用defaultdict
1 from collections import defaultdict 2 3 pairs = [('a', 1),('b', 5),('a', 4),('a', 3),('b', 8),('b', 6),('a', 2),('b', 7),] 4 d = defaultdict(list) # 参数可以是列表list,也可以是集合set 5 for k, v in pairs: 6 d[k].append(v) # 根据defaultdict的参数类型使用append或者add,defaultdict会自动创建不存在的key 7 8 print(d) 9 # defaultdict(<class 'list'>, {'a': [1, 4, 3, 2], 'b': [5, 8, 6, 7]})
## 字典求最大值,最小值,排序
1 scores = { 2 "Stanley": 88, 3 "Lily": 92, 4 "Bob": 91, 5 "Well": 80, 6 "Peter": 92 7 } 8 lowest = min(scores, key=lambda s: s[1]) 9 print(lowest) 10 # Well # 只能得到一个键 11 12 # 使用zip()函数反转键值对,sorted()函数自动比较第一个值,若第一个值相等则比较第二个值 13 14 ordered_scores = sorted(zip(scores.values(), scores.keys())) 15 lowest = min(ordered_scores) 16 highest = max(ordered_scores) 17 print(lowest) 18 # (80, 'Well') # 得到完整的值键对 19 print(highest) 20 # (92, 'Peter') # 分数相同比较第二个值, P的ASCII编码中比L大,所以结果是(92, 'Peter') 21 22 # 注意:zip()函数创建的只是一次性访问的迭代器,不可重复访问 23 24 zipped_scores = zip(scores.values(), scores.keys()) 25 lowest = min(zipped_scores) 26 highest = max(zipped_scores) # ValueError: max() arg is an empty sequence 27 print(lowest) 28 # (80, 'Well')
## 字典的异同比较
1 a = { 2 'x': 1, 3 'y': 2, 4 'z': 3 5 } 6 b = { 7 'o': 2, 8 'q': 4, 9 'y': 2 10 } 11 12 print(a.keys() - b.keys()) # 使用减号,返回两个字典中不相同的部分 13 # {'z', 'x'} 14 print(a.keys() & b.keys()) # 使用&返回两个字典的交集 15 # {'y'} 16 print(a.items() - b.items()) 17 # {('z', 3), ('x', 1)} 18 print(a.items() & b.items()) 19 # {('y', 2)} 20 # 21 # 不能使用 a.values() 和 b.values() 进行比较
参考资料:
Python Cookbook, 3rd edition, by David Beazley and Brian K. Jones (O’Reilly).