是否有更简单的方法可以按长度筛选出计数器键?
我已经尝试了以下它给出了过滤后的计数器的正确输出,但是它通过计数器作为列表进行迭代,然后再次将列表放入计数器。是否有更简单,计算成本更低的方法来做同样的事情?
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])
答案 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])