是否有更简单的方法来按长度过滤掉计数器键?蟒蛇

时间:2014-01-13 14:35:57

标签: python collections counter

是否有更简单的方法可以按长度筛选出计数器键?

我已经尝试了以下它给出了过滤后的计数器的正确输出,但是它通过计数器作为列表进行迭代,然后再次将列表放入计数器。是否有更简单,计算成本更低的方法来做同样的事情?

from collections import Counter

x = Counter(['a','a', 'ab', 'c', 'hij', 'k'])

threes = Counter([i for i,j in x.items() if len(i) == 3])
twos = Counter([i for i,j in x.items() if len(i) == 2])

2 个答案:

答案 0 :(得分:2)

使用collections.defaultdict将密钥长度映射到密钥列表:

from collections import Counter, defaultdict

x = Counter(['a', 'a', 'ab', 'c', 'hij', 'k']) # OR ['a','a','ab','c','hij','k']
by_length = defaultdict(list)
for key in x:
    by_length[len(key)].append(key)

print(by_length[1]) # prints: ['a', 'k', 'c']
print(by_length[2]) # prints: ['ab']
print(by_length[3]) # prints: ['hij']

顺便说一句,如果您想要的是按长度获取密钥列表,则无需创建Counter对象。

答案 1 :(得分:1)

您可以看到Counter文档here。简短的回答是,没有内置的方法来生成仅包含特定长度的项目的Counter

与原始列表分开创建新的Counter对象可能更有效:

l = ['a','a', 'ab', 'c', 'hij', 'k']
threes = Counter([x for x in l if len(x) == 3])