一. 1个键对应多个值
比如:d = {'a' : [1, 2, 3], 'b' : [4, 5]},可以使用 collections 模块中的 defaultdict 来构造这样的字典
from collections import defaultdict
#对应的多个值是列表形式
d = defaultdict(list)
d['a'].append(1)
d['a'].append(2)
d['b'].append(4)
#对应的多个值是集合形式
d = defaultdict(set)
d['a'].add(1)
d['a'].add(2)
d['b'].add(4)
注意:
1. 选择使用列表还是集合取决于你的实际需求。如果你想保持元素的插入顺序就应该使用列表,如果想去掉重复元素就使用集合(并且不关心元素的顺序问题)
2. defaultdict的用法和普通字典的用法是一样的,比如多值为集合形式时 d['a']的输出为{1,2}
二. 字典元素排序,使用OrderedDict
from collections import OrderedDict
d = OrderedDict()
d['foo'] = 1
d['bar'] = 2
d['spam'] = 3
d['grok'] = 4
for key in d:
print(key, d[key])
# Outputs "foo 1", "bar 2", "spam 3", "grok 4"
注意:一个 OrderedDict 的大小是一个普通字典的两倍,因为它内部维护着另外一个链表。所以如果你要构建一个需要大量 OrderedDict 实例的数据结构的时候 (比如读取 100,000 行 CSV 数据到一个 OrderedDict 列表中去),那么你就得仔细权衡一下是否使用 OrderedDict 带来的好处要大过额外内存消耗的影响
三. 字典中执行计算操作,使用zip()反转键和值
1. 正常情况下,在字典上的运算只会作用于键,对值是无效的,如下
>>> prices = { 'AAA' : 40, 'ZZZ': 28, 'BBB': 34 }
>>> min(prices)
'AAA'
>>> max(prices)
'ZZZ'
2. 如果想按数值进行排序或者计算,并且结果显示整个键值对。可以用zip()函数,把键值对反转
>>> fanzhuan = zip(prices.values(), prices.keys())
>>> min_price = min(fanzhuan)
>>> print(min_price)
(28, 'ZZZ')
注意:zip() 函数创建的是一个只能访问一次的迭代器,每次使用都需要重新调用此函数。
3. 使用zip()函数时,如果多个实体拥有相同的值的时候,键会决定返回结果
>>> prices = { 'AAA' : 45.23, 'ZZZ': 45.23 }
>>> min(zip(prices.values(), prices.keys()))
(45.23, 'AAA')
>>> max(zip(prices.values(), prices.keys()))
(45.23, 'ZZZ')
四. 查找两个字典中的相同点,比如相同的键名或者值
例如:a = {'x' : 1, 'y' : 2, 'z' : 3} b = {'w' : 10, 'x' : 11, 'y' : 2},现在查找这两个字典中的相同处,可以在两字典的 keys() 或者 items() 方法返回结果上执行集合操作
# 两个字典公有的键
>>> a.keys() & b.keys()
{'y', 'x'}
#只在a字典中存在的键
>>> a.keys() - b.keys()
{'z'}
#两个字典中共有的键值对
>>> a.items() & b.items()
{('y', 2)}
这些操作也可以用于修改或者过滤字典元素,比如下面使用列表推导式
>>> c = {key:a[key] for key in a.keys() - {'z'}}
>>> c
{'y': 2, 'x': 1}