Python Counter:计数为x的打印键

时间:2014-08-12 22:49:36

标签: python

假设我有一个代表一组单词的Counter对象:

>>> words = ['hello', 'hello', 'hello', 'world']
>>> counter = Counter(words)

找出哪些字数为1的一种方法是迭代counter

for word, count in counter.items():
    if count == 1:
        print(word)

有更简单/更好的方法吗?也就是说,可以反转" counter提供计数为x的单词?

6 个答案:

答案 0 :(得分:4)

要撤消任何映射 - 无论是Counterdict还是其他任何内容:

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']

然后,新列表将包含值worldtest

答案 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