1

我有一个包含 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,不能使用计数器。

4

5 回答 5

16

您可以使用模块Counter中的 a来执行此操作。collections

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)]
于 2012-04-11T04:04:23.570 回答
3

David 的回答是最好的——但是如果您使用的 Python 版本不包括 collections 模块中的 Counter(在 Python 2.7 中引入),您可以使用执行相同操作的 counter 类的这个实现。我怀疑它会比模块慢,但会做同样的事情。

于 2012-04-11T04:54:27.573 回答
3

大卫的解决方案是最好的。

但可能更有趣的是,这里有一个不导入任何模块的解决方案:

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']
于 2012-04-11T05:10:29.690 回答
2

不用Counter作问题请求的修改版本

heap.nlargest按照@Duncan 的建议改为使用

>>> 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']
于 2012-04-11T04:05:43.493 回答
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 类,它会创建一个包含 Iterable 中存在的所有元素的字典,然后将数据放入 heapq,key 是字典的值并检索 nargest

于 2012-04-11T05:36:08.067 回答