如何在python中获取列表中最常用的10个字符串

时间:2012-04-11 04:00:20

标签: python

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

5 个答案:

答案 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是字典的值并检索最小的