小编写这篇文章的主要目的,就是告诉大家一些知识,告诉大家如何使用Python对数据进行分组,另外,相关的代码,也会给贴出来,下面就给大家详细的解答下。
假如我们这儿有相关数据:
data=[ ("apple",30),("apple",35), ("apple",32),("pear",60), ("pear",32),("pear",60), ("banana",102),("banana",104) ] #我们希望变成如下格式 """
[('apple',[30,35,32]), ('pear',[60,32,60]), ('banana',[102,104])] """ 假如要是你的话,你应该要怎么去写这个代码呢? data=[ ("apple",30),("apple",35), ("apple",32),("pear",60), ("pear",32),("pear",60), ("banana",102),("banana",104) ] data_dict={} for name,count in data: if name not in data_dict: data_dict[name]=[] data_dict[name].append(count) print(data_dict) """ {'apple':[30,35,32], 'pear':[60,32,60], 'banana':[102,104]} """
print(list(data_dict.items())) """ [('apple',[30,35,32]), ('pear',[60,32,60]), ('banana',[102,104])] """
上述代码的书写方式是完全没有任何问题的,那么怎样才能写的更好一些,可以使用setdefault方法
data=[ ("apple",30),("apple",35), ("apple",32),("pear",60), ("pear",32),("pear",60), ("banana",102),("banana",104) ] data_dict={} for name,count in data: #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算是一个使用比较常见的方法了,但是就是使用率不高,每次调用的时候都会调用一个空值,所以这就会比较麻烦了。
from collections import defaultdict data=[ ("apple",30),("apple",35), ("apple",32),("pear",60), ("pear",32),("pear",60), ("banana",102),("banana",104) ] #里面接收一个callable #当访问的k不存在时,返回callable调用之后的值 data_dict1=defaultdict(list) for name,count in data: data_dict1[name].append(count) print(list(data_dict1.items())) """ [('apple',[30,35,32]), ('pear',[60,32,60]), ('banana',[102,104])] """ #也可以指定为set data_dict2=defaultdict(set) for name,count in data: data_dict2[name].add(count) print(list(data_dict2.items())) """ [('apple',{32,35,30}), ('pear',{32,60}), ('banana',{104,102})] """
总的来说,defaultdict和字典的setdefault方法非常类似,我们使用setdefault即可。
当然啦,关于分组,还有一种特殊情况,就是词频统计。假设我们想统计可迭代对象中,每个元素出现的次数该怎么做呢?
data=["apple","apple","apple", "pear","pear","pear", "banana","banana"] data_dict={} for item in data: #此处不能使用setdefault,因为它是函数 #.setdefault(item,0)+=1是不符合语法规则的 if item not in data_dict: data_dict[item]=0 data_dict[item]+=1 print(data_dict) """ {'apple':3,'pear':3,'banana':2} """ #或者使用defaultdict from collections import defaultdict data_dict=defaultdict(int) for item in data: data_dict[item]+=1 print(data_dict) """ defaultdict(<class'int'>, {'apple':3,'pear':3,'banana':2}) """
然而说到词频统计,我们还可以使用collections下的Counter类。
from collections import Counter data=["apple","apple","apple", "pear","pear","pear", "banana","banana"] data_dict=Counter(data) #直接搞定,Counter已经包含了我们之前的逻辑 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进行分组就为大家介绍到这里了,希望可以为各位读者带来帮助。
原创文章,作者:网友投稿,如若转载,请注明出处:https://www.cloudads.cn/archives/4091.html