# 整理自Python Cookbook

1. 保持字典有序

可以使用collections模块中的OrderedDict类,对字典做迭代时会严格按照元素的添加顺序进行。

from collections import OrderedDict

d = OrderedDict()
d['foo'] = 1
d['bar'] = 2
d['spam'] = 4

for key, value in d.items():
print(key,value)
# Outputs
foo 1
bar 2
spam 4
OrderedDict 内部维护了一个双向链表,会根据元素加入顺序来排列键的位置。在构建此数据结构时应考虑维护链表导致额外的内存开销。
2.字典计算
求字典中值的最大最小值
1)利用zip()
prices = {
'ACME' : 45.23,
'AAPLL' : 612.78,
'IBM' : 205.55
}
print(min(zip(prices.values(),prices.keys())))
 
利用zip()将字典的键和值反转过来,再利用min(),max()求得即可
zip()返回的是一个iterator内容只可以消费一次
2)利用min(), max()的参数key
在字典上执行常见的数据操作时会发现它们只会处理键,而不是值
min(prices, key=lambda k: prices[key])
# Outputs
'ACME'
3. 两字典间提取相同键/值
a = {
'x': 1,
'y': 2,
'z': 3
}
b = {
'w': 10,
'x': 11,
'y': 2
}
print(a.keys() & b.keys())
print(a.keys()-b.keys())
字典实际上就是一些列键和值之间的映射的集合,所以字典支持常见的集合操作,如求交,并,差
但字典的values()方法并不支持集合操作。
4. 通过公共键对字典列表排序
operator.itemgetter函数可以简单的实现要求
rows = sorted(rows, key=itemgetter('lname', 'fname'))
rows = sorted(rows, key=lambda r: (r['lname'].r['fname']))
两种方式都能正常工作,但通常itemgetter()会运行得更快
此方法对min(),max()同样适用
5. 根据字段将字典列表分段
itertools.groupby()函数对数据分组非常有效
rows.sort(key=itmegetter('name'))
for date,items in groupby(rows, key=itemgetter('date')):
  print(date)
  for i in items:
    print(' ', i)
groupby()函数通过扫描序列找到拥有相同值(或者参数key指定的函数所返回的值)的序列项,并将它们分组,创建了一个迭代器,每次迭代返回一个值(value)和一个子迭代器(sub_iterator)
子迭代器可产生所有在该分组内具有该值的项.
groupy()只能检查连续的项,所以使用前必须进行排序。
6. 字典中提取子集
prices = {
'ACME' : 45.23,
'AAPLL' : 612.78,
'IBM' : 205.55
}
p1 = {key:value for key, value in prices.items() if value >200}
print(p1)
也可创建元组序列然后调用dict()来得到,但没有前者清晰也没有前者快
 
posted on 2018-08-13 20:15  浅塘  阅读(635)  评论(0编辑  收藏  举报