単語のリストがあり、各単語がそのリストに表示される回数を検索するとします。
これを行う明白な方法は次のとおりです。
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的な方法はありますか?
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)で実行されます。
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})
標準的なアプローチ:
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
freqs = {}
for Word in words:
freqs[Word] = freqs.get(Word, 0) + 1 # fetch and increment OR initialize
これはTriptychのソリューションと同じですが、コレクションをインポートしないと思います。また、Selinapのソリューションに少し似ていますが、より読みやすいものです。 Thomas Weigelのソリューションとほぼ同じですが、例外を使用していません。
ただし、これはコレクションライブラリのdefaultdict()を使用するよりも遅くなる可能性があります。値がフェッチされ、インクリメントされてから再び割り当てられるため。単にインクリメントする代わりに。ただし、+ =を使用すると、内部で同じことが行われる場合があります。
標準の辞書方式(リストをループして適切な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)時間で実行されます。
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
カウントだけを使用することはできませんか?
words = 'the quick brown fox jumps over the lazy gray dog'
words.count('z')
#output: 1
以下の答えはいくつかの余分なサイクルがかかりますが、それは別の方法です
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)
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
お役に立てれば!
私はたまたま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}
リストを単一の辞書に変換するには、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}