假设我有一个代表一组单词的Counter
对象:
>>> words = ['hello', 'hello', 'hello', 'world']
>>> counter = Counter(words)
找出哪些字数为1的一种方法是迭代counter
:
for word, count in counter.items():
if count == 1:
print(word)
有更简单/更好的方法吗?也就是说,可以反转" counter
提供计数为x
的单词?
答案 0 :(得分:4)
要撤消任何映射 - 无论是Counter
,dict
还是其他任何内容:
rev = {v: k for k, v in d.items()}
然后你像任何其他词典一样使用它:
key_whose_count_is_10 = rev[10]
如果有两个具有相同值的键,则该值将任意映射到其中一个键。但这在您的问题中几乎是固有的。你要求"""计数为x
的密钥;如果有三个键的计数为x
,那么你想做什么?
如果您只打算进行一次查询,而不是多次查询,那么迭代效率会更高。哪一个更清晰(这几乎总是更重要)是有争议的。这是进行比较的一种方法:
key_whose_count_is_10 = next(k for k, v in d.items() if v==10)
答案 1 :(得分:3)
我认为将每个元素值1放在列表中要好得多。这是一种Pythonic方法:
new_list = [w for w in words if counter[w] == 1]
像这样,您会将words
中每个值为1的单词存储在您的计数器中。
因此,例如,如果您在列表中有另一个字符串,请说出字符串test
:
words = ['hello', 'hello', 'hello', 'world', 'test']
然后,新列表将包含值world
和test
。
答案 2 :(得分:2)
您的Counter
对象使用每个单词作为键,并将出现次数存储为值。
要做你想做的事,你需要使用出现次数作为关键字和单词列表作为值:
wordDict = {}
for word, count in counter.items():
if count in wordDict:
wordDict[count].append(word)
else:
wordDict[count] = [word]
然后,您可以使用wordDict[2]
来获取两次出现的字词列表。
答案 3 :(得分:0)
您可以使用列表推导来检查每个元素的计数
>>> words = ['hello', 'hello', 'hi', 'hi', 'world', 'foo', 'bar']
>>> from collections import Counter
>>> counter = Counter(words)
>>> [i for i in counter if counter[i] == 1]
['world', 'bar', 'foo']
您还可以使用原始列表中的count()
功能
>>> [i for i in words if words.count(i) == 1]
['world', 'foo', 'bar']
答案 4 :(得分:0)
您可以使用defaultdict
:
import collections
d = collections.defaultdict(list)
for word, count in counter.items():
d[count].append(word)
然后你可以这样做:
d[1]
获取计数一的所有单词(因为可以有一个或多个单词)。
答案 5 :(得分:0)
使用过滤器(如果导入了itertools,则使用ifilter)
n = 1
for word in filter(lambda w: counter[w] == n, words):
print word