关于字典的几个类--defaultdict,OrderedDict, zip()

 

一.  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}

 

posted @ 2018-07-26 16:54  坚强的小蚂蚁  阅读(675)  评论(0编辑  收藏  举报