如何将一个字典列表按字段分组
使用 itertools.groupby()
例:
dictlist = [
{'address': '5412 N CLARK', 'date': '07/01/2012'},
{'address': '5148 N CLARK', 'date': '07/04/2012'},
{'address': '5800 E 58TH', 'date': '07/02/2012'},
{'address': '2122 N CLARK', 'date': '07/03/2012'},
{'address': '5645 N RAVENSWOOD', 'date': '07/02/2012'},
{'address': '1060 W ADDISON', 'date': '07/02/2012'},
{'address': '4801 N BROADWAY', 'date': '07/01/2012'},
{'address': '1039 W GRANVILLE', 'date': '07/04/2012'}
]
#按'date'排序后分组
from operator import itemgetter
from itertools import groupby
dictlist.sort(key=itemgetter('date'))
for date, items in groupby(dictlist, key=itemgetter('date')):
print(date)
for i in items:
print(' ', i)
打印结果:
07/01/2012
{'address': '5412 N CLARK', 'date': '07/01/2012'}
{'address': '4801 N BROADWAY', 'date': '07/01/2012'}
07/02/2012
{'address': '5800 E 58TH', 'date': '07/02/2012'}
{'address': '5645 N RAVENSWOOD', 'date': '07/02/2012'}
{'address': '1060 W ADDISON', 'date': '07/02/2012'}
07/03/2012
{'address': '2122 N CLARK', 'date': '07/03/2012'}
07/04/2012
{'address': '5148 N CLARK', 'date': '07/04/2012'}
{'address': '1039 W GRANVILLE', 'date': '07/04/2012'}
过滤序列元素
使用列表推导,这是最简单的方法,比如:
mlist = [1,3,-5,12,-4,2,9,-1]
#过滤负数,只要大于0 的数
print([i for i in mlist if i > 0]) #[1, 3, 12, 2, 9]
#过滤正数,只要小于0 的数
print([i for i in mlist if i < 0]) #[-5, -4, -1]
如果数据比较大,考滤内存因素,可以运用生成器表达式遍历出来
filter()
有时候,过滤规则比较复杂,不能简单的在列表推导或者生成器表达式中表达出
来。比如,假设过滤的时候需要处理一些异常或者其他复杂情况。这时候你可以将过
滤代码放到一个函数中,然后使用内建的 filter() 函数。示例如下:
mlist = ['1', '2', '-3', '-', '4', 'N/A', '5']
#定义一个判断是否数字的方法
def is_int(val):
try:
x = int(val)
return True
except:
return False
#使用内建函数fillter()过滤
ret = list(filter(is_int,mlist))
print(ret) # ['1', '2', '-3', '4', '5']
Tips: filter() 函数只是创建了一个迭代器,想得到一个列表的话,就得使用 list() 去转换。
itertools.compress()
这是以一个 iterable对象和一个相对应的布尔选择器序列作为输入参数。然后输出 iterable 对象中对应选择器为 True 的元素。
mlist = [
'张三疯',
'独孤求败',
'风清扬',
'达摩祖师',
'扫地神僧',
'令狐冲',
'大理段思平'
]
#定义一个对应的列表
numblist = [1,15,3,4,5,0,13]
from itertools import compress
sorted_list = [n < 10 for n in numblist]
print(sorted_list) #[True, False, True, True, True, True, False]
#对应着列表过滤
ylist = list(compress(mlist,sorted_list))
print(ylist) #['张三疯', '风清扬', '达摩祖师', '扫地神僧', '令狐冲']
从字典中提取子集
字典推导
prices = {
'ACME': 45.23,
'AAPL': 612.78,
'IBM': 205.55,
'HPQ': 37.20,
'FB': 10.75
}
p1 = {key: value for key, value in prices.items() if value > 200}
print(p1) #{'AAPL': 612.78, 'IBM': 205.55}
tech_names = {
'AAPL',
'IBM',
'HPQ',
'MSFT'
}
p2 = {key: value for key, value in prices.items() if key in tech_names}
print(p2) #{'AAPL': 612.78, 'IBM': 205.55, 'HPQ': 37.2}
使用 dict ()
创建一个元组序列然后把它传给 dict() 函数也能实现,但速度慢一点点
p1 = dict((key, value) for key, value in prices.items() if value > 200)
print(p1) #{'AAPL': 612.78, 'IBM': 205.55}