码迷,mamicode.com
首页 > 其他好文 > 详细

字典的一些特殊用法

时间:2018-07-26 18:35:58      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:pre   计算   方法   数值   class   print   span   带来   无效   

 

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

 

字典的一些特殊用法

标签:pre   计算   方法   数值   class   print   span   带来   无效   

原文地址:https://www.cnblogs.com/regit/p/9372795.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!