我有一个单词列表:
words = ['all', 'awesome', 'all', 'yeah', 'bye', 'all', 'yeah']
我想得到一个元组列表:
[(3, 'all'), (2, 'yeah'), (1, 'bye'), (1, 'awesome')]
每个元组都是......
(number_of_occurrences, word)
列表应按出现次数排序。
到目前为止我做了什么:
def popularWords(words):
dic = {}
for word in words:
dic.setdefault(word, 0)
dic[word] += 1
wordsList = [(dic.get(w), w) for w in dic]
wordsList.sort(reverse = True)
return wordsList
问题是......
是Pythonic,优雅而高效吗? 你能做得更好吗? 提前谢谢。
答案 0 :(得分:11)
您可以使用counter进行此操作。
import collections
words = ['all', 'awesome', 'all', 'yeah', 'bye', 'all', 'yeah']
counter = collections.Counter(words)
print(counter.most_common())
>>> [('all', 3), ('yeah', 2), ('bye', 1), ('awesome', 1)]
它为元组提供了反向列。
来自评论:collections.counter是> = 2.7,3.1。您可以使用the counter recipe作为较低版本。
答案 1 :(得分:6)
您正在寻找defaultdict集合:
from collections import defaultdict
D = defaultdict(int)
for word in words:
D[word] += 1
这会给你一个词典,其中键是单词,值是频率。要获得你的(频率,单词)元组:
tuples = [(freq, word) for word,freq in D.iteritems()]
如果使用Python 2.7 + / 3.1 +,您可以使用内置Counter
类执行第一步:
from collections import Counter
D = Counter(words)
答案 2 :(得分:2)