当前位置: 首页 > 后端技术 > Python

如何优雅地分组数据?

时间:2023-03-26 19:36:31 Python

假设我们有这样一个数据:data=[("apple",30),("apple",35),("apple",32),("pear",60),("pear",32),("pear",60),("banana",102),("banana",104)]#我们希望变成如下格式"""[('apple',[30,35,32]),('梨',[60,32,60]),('香蕉',[102,104])]"""如果是你,你会怎么做?一个简单的解决方案是构造一个字典:data=[("apple",30),("apple",35),("apple",32),("pear",60),("pear",32),("pear",60),("banana",102),("banana",104)]data_dict={}forname,countindata:ifnamenotindata_dict:data_dict[名称]=[]data_dict[name].append(count)print(data_dict)"""{'apple':[30,35,32],'pear':[60,32,60],'banana':[102,104]}"""print(list(data_dict.items()))"""[('苹果',[30,35,32]),('梨',[60,32,60]),('banana',[102,104])]"""这个方案没有问题,但是我们可以写的更优雅一点,就是使用字典的setdefault方法:data=[("苹果",30),("苹果",35),("苹果",32),("梨",60),("梨",32),("梨",60),("banana",102),("banana",104)]data_dict={}forname,countindata:#setdefault(k,v)意思如下#当k不存在时,设置k:v在字典中,并返回v#当k存在时,直接返回k对应的值data_dict.setdefault(name,[]).append(count)print(list(data_dict.items()))"""[('apple',[30,35,32]),('pear',[60,32,60]),('banana',[102,104])]"""setdefault是一个很方便的方法,但是使用频率不是很高,或者说这个方法不是很讨人喜欢,主要是每次调用都要给一个初值,比如代码中的空列表[],另外这里的初值可以任意.如果要加的话,也可以达到去重效果t,只需将空列表替换为空集合即可。或者我们可以使用defaultdict,它位于collections模块中。fromcollectionsimportdefaultdictdata=[("apple",30),("apple",35),("apple",32),("pear",60),("pear",32),("pear",60),("banana",102),("banana",104)]#里面接收一个callable#当访问的k不存在时,返回callable调用后的值data_dict1=defaultdict(list)forname,计算数据:data_dict1[name].append(count)print(list(data_dict1.items()))"""[('apple',[30,35,32]),('pear',[60,32,60]),('banana',[102,104])]"""#也可以指定为setdata_dict2=defaultdict(set)forname,countindata:data_dict2[name].add(count)print(list(data_dict2.items()))"""[('苹果',{32,35,30}),('梨',{32,60}),('香蕉',{104,102})]"""一般来说,defaultdict和字典的setdefault方法很相似,我们直接用setdefault就可以了。当然,分组还有一个特例,就是词频统计。假设我们要统计一个可迭代对象中每个元素出现的次数,应该怎么做呢?data=["apple","apple","apple","pear","pear","pear","banana","banana"]data_dict={}foritemindata:#setdefault不能在这里使用,因为它是一个函数#.setdefault(item,0)+=1如果item不在data_dict中则不符合语法:data_dict[item]=0data_dict[item]+=1print(data_dict)"""{'apple':3,'pear':3,'banana':2}"""#或者使用defaultdictfromcollectionsimportdefaultdictdata_dict=defaultdict(int)foritemindata:data_dict[item]+=1print(data_dict)"""defaultdict(,{'apple':3,'pear':3,'banana':2})"""不过,在词频统计方面,我们也可以使用collections下的Counter类。fromcollectionsimportCounterdata=["apple","apple","apple","pear","pear","pear","banana","banana"]data_dict=Counter(data)#直接搞定,Counter有been包含了我们之前的逻辑print(data_dict)"""Counter({'apple':3,'pear':3,'banana':2})"""#counter继承了dict,另外还支持字典操作#很多还提供了其他操作,其中一个是most_common#用于选择出现频率最高的元素print(data_dict.most_common(2))"""[('apple',3),('pear',3)]"”“还是很简单的。以上就是本次分享的全部内容。觉得文章还不错的话,请关注公众号:Python编程学习圈,每日干货分享,发送“J”还能收到海量学习资料,涵盖Python电子书和教程,数据库编程、Django、爬虫、云计算等。或者去编程学习网了解更多编程技术知识。