如何用Python对数据进行分组

  小编写这篇文章的主要目的,就是告诉大家一些知识,告诉大家如何使用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

发表评论

登录后才能评论