web-dev-qa-db-ja.com

Pythonのアイテム頻度カウント

単語のリストがあり、各単語がそのリストに表示される回数を検索するとします。

これを行う明白な方法は次のとおりです。

words = "Apple banana Apple strawberry banana lemon"
uniques = set(words.split())
freqs = [(item, words.split().count(item)) for item in uniques]
print(freqs)

しかし、プログラムはWordリストを2回実行し、1回はセットを作成し、2回目は外観の数をカウントするため、このコードはあまり良くありません。

もちろん、リストを実行してカウントを行う関数を作成することもできますが、それはそれほどPythonicではありません。だから、より効率的でPython的な方法はありますか?

53
Daniyar

defaultdict 救助に!

from collections import defaultdict

words = "Apple banana Apple strawberry banana lemon"

d = defaultdict(int)
for Word in words.split():
    d[Word] += 1

これはO(n)で実行されます。

93
Triptych

Counterモジュールの collections class は、このタイプの問題を解決するために構築された目的です。

from collections import Counter
words = "Apple banana Apple strawberry banana lemon"
Counter(words.split())
# Counter({'Apple': 2, 'banana': 2, 'strawberry': 1, 'lemon': 1})
129
sykora

標準的なアプローチ:

from collections import defaultdict

words = "Apple banana Apple strawberry banana lemon"
words = words.split()
result = collections.defaultdict(int)
for Word in words:
    result[Word] += 1

print result

Groupby oneliner:

from itertools import groupby

words = "Apple banana Apple strawberry banana lemon"
words = words.split()

result = dict((key, len(list(group))) for key, group in groupby(sorted(words)))
print result
11
nosklo
freqs = {}
for Word in words:
    freqs[Word] = freqs.get(Word, 0) + 1 # fetch and increment OR initialize

これはTriptychのソリューションと同じですが、コレクションをインポートしないと思います。また、Selinapのソリューションに少し似ていますが、より読みやすいものです。 Thomas Weigelのソリューションとほぼ同じですが、例外を使用していません。

ただし、これはコレクションライブラリのdefaultdict()を使用するよりも遅くなる可能性があります。値がフェッチされ、インクリメントされてから再び割り当てられるため。単にインクリメントする代わりに。ただし、+ =を使用すると、内部で同じことが行われる場合があります。

9
hopla

標準の辞書方式(リストをループして適切なdict。キーをインクリメントする)を使いたくない場合は、これを試すことができます:

>>> from itertools import groupby
>>> myList = words.split() # ['Apple', 'banana', 'Apple', 'strawberry', 'banana', 'lemon']
>>> [(k, len(list(g))) for k, g in groupby(sorted(myList))]
[('Apple', 2), ('banana', 2), ('lemon', 1), ('strawberry', 1)]

O(n log n)時間で実行されます。

7
Nick Presta

Defaultdictなし:

words = "Apple banana Apple strawberry banana lemon"
my_count = {}
for Word in words.split():
    try: my_count[Word] += 1
    except KeyError: my_count[Word] = 1
3
Thomas Weigel

カウントだけを使用することはできませんか?

words = 'the quick brown fox jumps over the lazy gray dog'
words.count('z')
#output: 1
0
Antonio

以下の答えはいくつかの余分なサイクルがかかりますが、それは別の方法です

def func(tup):
    return tup[-1]


def print_words(filename):
    f = open("small.txt",'r')
    whole_content = (f.read()).lower()
    print whole_content
    list_content = whole_content.split()
    dict = {}
    for one_Word in list_content:
        dict[one_Word] = 0
    for one_Word in list_content:
        dict[one_Word] += 1
    print dict.items()
    print sorted(dict.items(),key=func)
0
Prabhu S
words = "Apple banana Apple strawberry banana lemon"
w=words.split()
e=list(set(w))       
for i in e:
   print(w.count(i))    #Prints frequency of every Word in the list

お役に立てれば!

0

私はたまたまSparkエクササイズ、ここに私の解決策があります。

tokens = ['quick', 'brown', 'fox', 'jumps', 'lazy', 'dog']

print {n: float(tokens.count(n))/float(len(tokens)) for n in tokens}

**#上記の出力**

{'brown': 0.16666666666666666, 'lazy': 0.16666666666666666, 'jumps': 0.16666666666666666, 'fox': 0.16666666666666666, 'dog': 0.16666666666666666, 'quick': 0.16666666666666666}
0
javaidiot

リストを単一の辞書に変換するには、reduce()を使用します。

words = "Apple banana Apple strawberry banana lemon"
reduce( lambda d, c: d.update([(c, d.get(c,0)+1)]) or d, words.split(), {})

返す

{'strawberry': 1, 'lemon': 1, 'Apple': 2, 'banana': 2}
0
Gadi