我有一个包含93个不同字符串的列表。我需要找到10个最常见的字符串,并且返回必须按照从最频繁到最不频繁的顺序进行。
mylist = ['"and', '"beware', '`twas', 'all', 'all', 'and', 'and', 'and', 'and', 'and', 'and', 'and', 'and', 'and', 'and', 'and', 'and', 'and', 'arms', 'as', 'as', 'awhile', 'back', 'bandersnatch', 'beamish', 'beware', 'bird', 'bite', 'blade', 'borogoves', 'borogoves', 'boy', 'brillig']
# this is just a sample of the actual list.
我没有最新版本的python,也无法使用计数器。
答案 0 :(得分:14)
您可以使用Counter
中的collections
module来执行此操作。
from collections import Counter
c = Counter(mylist)
然后执行c.most_common(10)
返回
[('and', 13),
('all', 2),
('as', 2),
('borogoves', 2),
('boy', 1),
('blade', 1),
('bandersnatch', 1),
('beware', 1),
('bite', 1),
('arms', 1)]
答案 1 :(得分:3)
David的答案是最好的 - 但是如果您使用的是不包含来自集合模块的Python的Python版本(在Python 2.7中引入),则可以使用this implementation的反击类做同样的事情。我怀疑它会比模块慢,但会做同样的事情。
答案 2 :(得分:2)
不使用Counter
作为问题请求的修改版本
根据@Duncan
的建议更改为使用heap.nlargest
>>> from collections import defaultdict
>>> from operator import itemgetter
>>> from heapq import nlargest
>>> mylist = ['"and', '"beware', '`twas', 'all', 'all', 'and', 'and', 'and', 'and', 'and', 'and', 'and', 'and', 'and', 'and', 'and', 'and', 'and', 'arms', 'as', 'as', 'awhile', 'back', 'bandersnatch', 'beamish', 'beware', 'bird', 'bite', 'blade', 'borogoves', 'borogoves', 'boy', 'brillig']
>>> c = defaultdict(int)
>>> for item in mylist:
c[item] += 1
>>> [word for word,freq in nlargest(10,c.iteritems(),key=itemgetter(1))]
['and', 'all', 'as', 'borogoves', 'boy', 'blade', 'bandersnatch', 'beware', 'bite', 'arms']
答案 3 :(得分:2)
大卫的解决方案是最好的。
但可能更有趣的是,这里有一个不导入任何模块的解决方案:
dicto = {}
for ele in mylist:
try:
dicto[ele] += 1
except KeyError:
dicto[ele] = 1
top_10 = sorted(dicto.iteritems(), key = lambda k: k[1], reverse = True)[:10]
结果:
>>> top_10
[('and', 13), ('all', 2), ('as', 2), ('borogoves', 2), ('boy', 1), ('blade', 1), ('bandersnatch', 1), ('beware', 1), ('bite', 1), ('arms', 1)]
编辑:
回答后续问题:
new_dicto = {}
for val, key in zip(dicto.itervalues(), dicto.iterkeys()):
try:
new_dicto[val].append(key)
except KeyError:
new_dicto[val] = [key]
alph_sorted = sorted([(key,sorted(val)) for key,val in zip(new_dicto.iterkeys(), new_dicto.itervalues())], reverse = True)
结果:
>>> alph_sorted
[(13, ['and']), (2, ['all', 'as', 'borogoves']), (1, ['"and', '"beware', '`twas', 'arms', 'awhile', 'back', 'bandersnatch', 'beamish', 'beware', 'bird', 'bite', 'blade', 'boy', 'brillig'])]
如果您注意到某些单词中含有额外的引号,那么显示一次的单词会按字母顺序排序。
编辑:
回答另一个跟进问题:
top_10 = []
for tup in alph_sorted:
for word in tup[1]:
top_10.append(word)
if len(top_10) == 10:
break
结果:
>>> top_10
['and', 'all', 'as', 'borogoves', '"and', '"beware', '`twas', 'arms', 'awhile', 'back']
答案 4 :(得分:1)
如果您的Python版本不支持Counter,您可以采用Counter的实现方式
>>> import operator,collections,heapq
>>> counter = collections.defaultdict(int)
>>> for elem in mylist:
counter[elem]+=1
>>> heapq.nlargest(10,counter.iteritems(),operator.itemgetter(1))
[('and', 13), ('all', 2), ('as', 2), ('borogoves', 2), ('boy', 1), ('blade', 1), ('bandersnatch', 1), ('beware', 1), ('bite', 1), ('arms', 1)]
如果您看到Counter Class,它会创建一个字典,显示Iterable中存在的所有元素的出现 然后它将数据放入heapq,key是字典的值并检索最小的