python分组函数的使用 groupby

项目使用场景:需要对一个包含字典的列表进行数据格式的转化,指定 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)
<itertools.groupby object at 0x06D7AA50>
[r for r in res]
[({'name': 'zhangsan', 'age': 20, 'country': 'China'},
  <itertools._grouper at 0x6c7e410>),
 ({'name': 'wangwu', 'age': 19, 'country': 'USA'},
  <itertools._grouper at 0x6c7ef70>),
 ({'name': 'lisi', 'age': 22, 'country': 'JP'},
  <itertools._grouper at 0x6c7e0f0>),
 ({'name': 'zhaoliu', 'age': 22, 'country': 'USA'},
  <itertools._grouper at 0x6c7e2f0>),
 ({'name': 'pengqi', 'age': 22, 'country': 'USA'},
  <itertools._grouper at 0x6c7e210>),
 ({'name': 'lijiu', 'age': 22, 'country': 'China'},
  <itertools._grouper at 0x6c7e630>)]
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'}]}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值