我有一个这样的设置对象
{'Book',
'car',
'bird',
'cup',
'book',
...
'river'}
因为在Python中,set object不支持索引。如果我想提取某些元素,请说“预订”。并且它的小写形式来自集合并计算它们的频率相对于集合中元素(即,令牌)的总数。方便的方法是什么?
谢谢。
答案 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
。请考虑使用list
或tuple
初始化您的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