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

3

有没有更简单的方法按长度过滤Counter的键?

我尝试了以下代码,它可以正确地输出过滤后的Counter,但是它将Counter作为列表进行迭代,然后再将列表转换成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])

1
你有特别想使用 Counter 对象的原因吗?看起来你最好使用自定义的类似于 Counter 的对象,在插入时进行专门计数,而不是将你需要的东西强行塞进 Counter 中的多次解决方案。 - Silas Ray
由于后续管道中将发生一些向量化操作,因此基本计数器易于管理。 - alvas
1
但是Counter只是像一个dict一样用于读取。仍然没有看到特别需要使用Counter的原因。 - Silas Ray
一个计数器是一个defaultdict,就我所理解的,但它有一些自定义方法(你没有使用吗?)顺便说一句,如果使用生成器(即不是Counter([x for x in y]),而是Counter(x for x in y)),我会期望它稍微快一点。我在Python 2.6上,没有计数器,无法运行此比较。 - Corley Brigman
2个回答

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对象。


我的输入是一个计数器,因此它需要返回一个经过筛选的计数器 =) - alvas

1
你可以在这里查看Counter文档。简单来说,没有内置方法可以生成仅包含特定长度项的Counter
最好是从原始列表单独创建新的Counter对象,这样会更有效率:
l = ['a','a', 'ab', 'c', 'hij', 'k']
threes = Counter([x for x in l if len(x) == 3])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接