项目使用场景
:需要对一个包含字典的列表进行数据格式的转化,指定 dict 中某个具体 key 的value 作为 新的 key,新的 value 是一个列表,包含了原始的那些数据
from itertools import groupby
from operator import itemgetter
import pprint
d1={'name':'zhangsan','age':20,'country':'China'}
d2={'name':'wangwu','age':19,'country':'USA'}
d3={'name':'lisi','age':22,'country':'JP'}
d4={'name':'zhaoliu','age':22,'country':'USA'}
d5={'name':'pengqi','age':22,'country':'USA'}
d6={'name':'lijiu','age':22,'country':'China'}
# 定义一个原始的数据列表
lst=[d1,d2,d3,d4,d5,d6]
pprint.pprint(lst)
[{'age': 20, 'country': 'China', 'name': 'zhangsan'},
{'age': 19, 'country': 'USA', 'name': 'wangwu'},
{'age': 22, 'country': 'JP', 'name': 'lisi'},
{'age': 22, 'country': 'USA', 'name': 'zhaoliu'},
{'age': 22, 'country': 'USA', 'name': 'pengqi'},
{'age': 22, 'country': 'China', 'name': 'lijiu'}]
# 将 country 的值作为 key,即通过 conutry 对原始数据进行分组。
# groupby() 函数用法
"""
groupby(iterable, key=None)
返回一个连续的由可迭代对象的 key, value 组成的迭代器。如果没有指定 key 的函数或者为 None,将返回自身。
"""
res = groupby(lst)
pprint.pprint(res)
[r for r in res]
[({'name': 'zhangsan', 'age': 20, 'country': 'China'},
),
({'name': 'wangwu', 'age': 19, 'country': 'USA'},
),
({'name': 'lisi', 'age': 22, 'country': 'JP'},
),
({'name': 'zhaoliu', 'age': 22, 'country': 'USA'},
),
({'name': 'pengqi', 'age': 22, 'country': 'USA'},
),
({'name': 'lijiu', 'age': 22, 'country': 'China'},
)]
res = groupby(lst, key=lambda x:x['country'] )
# 从上面的列表推导式可以看出每一条数据都是有两个数据的元祖
res = {country:[t for t in item] for country, item in res}
pprint.pprint(res)
{'China': [{'age': 20, 'country': 'China', 'name': 'zhangsan'},
{'age': 22, 'country': 'China', 'name': 'lijiu'}],
'JP': [{'age': 22, 'country': 'JP', 'name': 'lisi'}],
'USA': [{'age': 19, 'country': 'USA', 'name': 'wangwu'},
{'age': 22, 'country': 'USA', 'name': 'zhaoliu'},
{'age': 22, 'country': 'USA', 'name': 'pengqi'}]}
# 使用 itemgetter() 和使用 lambda 函数是一样的效果 anyway 我们可以自定义函数来进行 key 值的处理
res = groupby(lst, key=itemgetter('country') )
res = {country:list(item) for country, item in res}
pprint.pprint(res)
{'China': [{'age': 20, 'country': 'China', 'name': 'zhangsan'},
{'age': 22, 'country': 'China', 'name': 'lijiu'}],
'JP': [{'age': 22, 'country': 'JP', 'name': 'lisi'}],
'USA': [{'age': 19, 'country': 'USA', 'name': 'wangwu'},
{'age': 22, 'country': 'USA', 'name': 'zhaoliu'},
{'age': 22, 'country': 'USA', 'name': 'pengqi'}]}