从集合中提取元素并计算其频率

时间:2017-08-12 20:34:17

标签: python count set token

我有一个这样的设置对象

{'Book',
 'car',
 'bird',
 'cup',
 'book',
 ...
 'river'}

因为在Python中,set object不支持索引。如果我想提取某些元素,请说“预订”。并且它的小写形式来自集合并计算它们的频率相对于集合中元素(即,令牌)的总数。方便的方法是什么?

谢谢。

4 个答案:

答案 0 :(得分:4)

您可以通过宣传其小写(或案例折叠)版本的出现(或set保证唯一性,因为collections.Counter保证唯一性时问题没有意义)使用{来计算列表中单词的次数。 {1}}:

import collections

s = {'Book',
 'car',
 'bird',
 'cup',
 'book',
 'CuP',
 'river'}

c = collections.Counter(map(str.casefold,s))

print(c)

结果:

Counter({'book': 2, 'cup': 2, 'river': 1, 'car': 1, 'bird': 1})

和频率:

freq = {k:v/len(s) for k,v in c.items()}  # python 2: needs `float(v)/...`

给出:

{'cup': 0.2857142857142857, 'river': 0.14285714285714285, 'car': 0.14285714285714285, 'bird': 0.14285714285714285, 'book': 0.2857142857142857}

正如一句精彩的评论所解释的那样,str.casefold处理的案件数量更多(没有双关语!),而不是str.lower,即使str.lower适用于大多数单词(使用str.lower Python 2.x,因为casefold不可用)

答案 1 :(得分:1)

这很方便(它也适用于列表):

from itertools import product
from collections import Counter
mySet = {'Book',
 'car',
 'bird',
 'cup',
 'book',
 'river'}

def Cc(s): # generates all possible cases for a string
  s = s.lower()
  for p in product(*[(0,1)]*len(s)):
    yield ''.join(c.upper() if t else c for t,c in zip(p,s))

elements = list(Cc("book")) # ['book','Book','bOok',....,'BOOK']
counts = Counter(mySet)
avg = sum(counts[e] for e in elements)/len(mySet)
print(avg) # => 0.3333333333333333

答案 2 :(得分:1)

  

如果我想提取某些元素,请说“预订”。它的小写形式' book'来自集合并计算它们的频率相对于集合中元素(即代币)的总数。

如果您想查找集合中某个元素的频率,可以使用collections.Counter来完成此操作:

>>> from collections import Counter
>>> s = \
  {'Book',
 'car',
 'bird',
 'cup',
 'book',
 'river'}
>>> c = Counter(s)
>>> c['Book']
1
>>> c['book']
1
>>> 

但要意识到,set不支持重复元素,因此频率始终为1。请考虑使用listtuple初始化您的Counter对象。

答案 3 :(得分:1)

mySet =  {'Book','car','bird','cup','book','river'}

counter = lambda s, element: len([e for e in s if element.lower() == e.lower()])

print(counter(mySet, "Book"))

结果:

2