Python学习笔记:itertools 中的groupby的用法详解
利用代码的结果展示更为清晰
from operator import itemgetter
from itertools import groupby
s1={'name':'wtc','school':'QH','age':21}
s2={'name':'hpl','school':'ND','age':22}
s3={'name':'bfd','school':'ND','age':19}
s4={'name':'hzl','school':'MIT','age':25}
s5={'name':'gmc','school':'MIT','age':22}
s6={'name':'jeamsbandon','school':'MIT','age':24}
lst=[s1,s2,s3,s4,s5,s6]
#通过school进行分组
lst.sort(key=itemgetter('school'))
ls = groupby(lst,itemgetter('school'))
for value,groups in ls:
for group in groups:
print (value,group)
程序运行后的结果:
Groupby使用之前先进行排序,如果不排序无法进行分组,或者说分组可能达不到预期。sort()是永久性排序,会改变原列表顺序;sorted()是临时排序,不会改变原列表顺序。lst=[s1,s2,s3,s4,s5,s6] 把这六个字典存在列表中,使用sort排序对列表操作。lst.sort(key=itemgetter(‘school’))的意思是按字典中键值对中的键school对应的值来进行排序。等待排序完成后执行ls = groupby(lst,itemgetter(‘school’)) 这时的操作是把排好序的列表lst再进行分组,还是按照 键school对应的值来进行分组。所以就会分成[{‘name’:‘hpl’,‘school’:‘ND’,‘age’:22},{‘name’:‘bfd’,‘school’:‘ND’,‘age’:19}]这两个一组,然后[{‘name’:‘wtc’,‘school’:‘QH’,‘age’:21} ]自己一组。 [{‘name’:‘hzl’,‘school’:‘MIT’,‘age’:25},{‘name’:‘gmc’,‘school’:‘MIT’,‘age’:22},{‘name’:‘jeamsbandon’,‘school’:‘MIT’,‘age’:24}]三个一组,然后for value,groups in ls: for group in groups: print value,group 中value取的是键school对应的值,而groups取的是一个组,也就是上面三个组,所以group取的是组内的一整个字典。
下面是对数值进行操作:
from itertools import groupby
lst=[45, 70, 55, 66, 87, 98, 100, 88, 96, 68]
def sorts(valuess):
if valuess < 60:
return 'not pass'
elif valuess >= 90:
return 'excellence'
else:
return 'OK'
print ([(value,list(group)) for value,group in groupby(sorted(lstt),key=sorts)])
程序运行后的结果:
[(k,list(g))for k,g in groupby(sorted(lst),key=gb)] sorted(lst)对于列表lst中的数值进行临时排序,排序时的关键字是按照从函数gb中返回来的结果。groupby(sorted(lst),key=gb) 然后进行分组,因为排序是从小到大的顺序进行排列的,所以整个分组的结果就是[(‘less’, [2, 6, 8, 9]), (‘middle’, [11, 25, 29]), (‘great’, [43, 51, 66])]
,而变成列表方式输出是因为(k,list(g))首先把g取回来的组变成了列表形式,最后输出的时使用列表框括起来的。