有没有更简单的方法按长度过滤出计数器键?python

有没有更简单的方法按长度过滤出计数器键?python,python,collections,counter,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 = Counte

有没有更简单的方法按长度过滤出计数器键

我尝试了以下方法,它给出了过滤计数器的正确输出,但它将计数器作为列表进行迭代,然后将列表再次放入计数器中。有没有一种更简单、计算成本更低的方法可以做到这一点

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

您可以查看
计数器
文档。简而言之,没有一种内置方法来生成只包含特定长度项的
计数器

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

l = ['a','a', 'ab', 'c', 'hij', 'k']
threes = Counter([x for x in l if len(x) == 3])
用于将密钥长度映射到密钥列表:

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

顺便说一句,如果您想要按长度获取密钥列表,则不需要创建
计数器
对象。

您是否有理由特别坚持使用
计数器
对象?似乎最好使用一个自定义的
计数器
-类对象,该对象在插入时在一次传递中执行专门的计数,而不是一些将所需内容插入
计数器
的多传递解决方案。由于稍后将在管道中发生一些矢量化,因此基本计数器将易于管理。但是一个
计数器
就像一个
dict
用于读取。仍然没有看到需要一个
计数器
特别是。据我所知,计数器是一个默认的dict,但有一些自定义方法(你没有使用?)顺便说一句,我希望如果使用生成器,它会稍微快一点(即,不用
计数器([x代表x在y])
,只需执行
计数器(x代表x在y中)
。我使用的是python 2.6,因此没有计数器,也无法运行此比较。我的输入是一个计数器,因此它只需要返回一个经过筛选的计数器=)