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 2.7 で導入された) collections モジュールの Counter を含まないバージョンの Python を使用している場合は、同じことを行うカウンター クラスのこの実装を使用できます。モジュールよりも遅いと思いますが、同じことをします。

于 2012-04-11T04:54:27.573 に答える
3

Davidのソリューションが最適です。

しかし、おそらく何よりも楽しみのために、モジュールをインポートしないソリューションを次に示します。

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 に入れます。キーは辞書の値であり、nargest を取得します。

于 2012-04-11T05:36:08.067 に答える