python组函数_Python组函数groupby的使用,python,分组

项目使用场景

:需要对一个包含字典的列表进行数据格式的转化,指定 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'}]}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值