【问题标题】:Is there a simpler way to filter out Counter keys by length? python有没有更简单的方法来按长度过滤掉计数器键? Python
【发布时间】:2014-02-01 08:22:36
【问题描述】:

有没有更简单的方法来按长度过滤掉 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])

【问题讨论】:

  • 您是否有理由特别坚持使用Counter 对象?似乎你会更好地使用一个自定义的 Counter 类对象,它会在一次插入时进行专门的计数,而不是一些将你需要的东西硬塞到 Counter 的多遍解决方案。
  • 因为流水线后期会发生一些矢量化,所以基本的 Counter 很容易管理。
  • 但是Counter 就像dict 一样用于阅读。仍然没有看到特别需要Counter
  • 一个计数器 is 是一个默认字典,据我所知,但有一些自定义方法(你没有使用?)顺便说一句,我预计它会稍微如果使用生成器会更快(即,而不是 Counter([x for x in y]),只需执行 Counter(x for x in y)。我在 python 2.6 上,所以没有计数器,但无法运行此比较。

标签: python collections counter


【解决方案1】:

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

【讨论】:

  • 我的输入是一个计数器,所以它只需要返回一个过滤后的计数器 =)
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    • 2023-02-21
    • 1970-01-01
    • 2012-04-11
    • 2011-10-26
    • 2015-04-03
    • 1970-01-01
    相关资源
    最近更新 更多