您的位置:首页 > 编程语言 > Python开发

python groupby

2017-11-29 00:00 253 查看
from itertools import groupby

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]

# 使用前必须安照关键字排序
lst.sort(key=lambda x: x['country'])

# 安装country分组,返回一个迭代器,只能使用一次
g = groupby(lst,
key=lambda x: x['country']
)

print(type(g))

# 遍历
# for key, list in g:
#     print(key)
#     for i in list:
#         print(i)

# 将键值转化为列表
# print([key for key, group in g])
# ['China', 'JP', 'USA']

'''
China
{'name': 'zhangsan', 'age': 20, 'country': 'China'}
{'name': 'lijiu', 'age': 22, 'country': 'China'}
JP
{'name': 'lisi', 'age': 22, 'country': 'JP'}
USA
{'name': 'wangwu', 'age': 19, 'country': 'USA'}
{'name': 'zhaoliu', 'age': 22, 'country': 'USA'}
{'name': 'pengqi', 'age': 22, 'country': 'USA'}
'''

# 生成字典,按照键和对应的列表
# 将迭代器转化为列表
# d = {
#     key: list(val) for key, val in g
# }
#
# for k, v in d.items():
#     print(k)
#     for i in v:
#         print(i)
'''
China
{'name': 'zhangsan', 'age': 20, 'country': 'China'}
{'name': 'lijiu', 'age': 22, 'country': 'China'}
JP
{'name': 'lisi', 'age': 22, 'country': 'JP'}
USA
{'name': 'wangwu', 'age': 19, 'country': 'USA'}
{'name': 'zhaoliu', 'age': 22, 'country': 'USA'}
{'name': 'pengqi', 'age': 22, 'country': 'USA'}
'''
# 各组的数目
# d = {
#     key: len(list(val)) for key, val in g
# }
# {'China': 2, 'JP': 1, 'USA': 3}
# print(d)
# 过滤分组,由于val是一个迭代器,只能使用一次
# {'China': [], 'USA': []}
# print({
#     key: list(val) for key, val in g if len(list(val)) >= 2
# })
# d = [
#     (key, list(val)) for key, val in g
# ]
# print(d)
# nd = dict(filter(lambda x: len(x[1]) >= 2, d))
# print(nd)

#  或者:
# d = {
#     key: list(val) for key, val in g
# }
# print(d)
# nd = dict(filter(lambda item: len(item[1]) > 2, d.items()))
# print(nd)
# {'USA': [{'name': 'wangwu', 'age': 19, 'country': 'USA'}, {'name': 'zhaoliu', 'age': 22, 'country': 'USA'}, {'name': 'pengqi', 'age': 22, 'country': 'USA'}]}

# 返回包含有2个以上元素的分组

# print([
#     key for key, val in g if len(list(val)) >= 2
# ])
# 返回:['China', 'USA']

# 自定义分组
lst = [2, 8, 11, 25, 43, 6, 9, 29, 51, 66]

def gb(num):
if num <= 10:
return 'less'
elif num >= 30:
return 'great'
else:
return 'middle'

print([(k, list(g))
for k, g in groupby(sorted(lst), key=gb)])
# [('less', [2, 6, 8, 9]), ('middle', [11, 25, 29]), ('great', [43, 51, 66])]

d = {
k: list(g) for k, g in groupby(sorted(lst), key=gb)

}
print(d)
# {'less': [2, 6, 8, 9], 'middle': [11, 25, 29], 'great': [43, 51, 66]}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  groupby