python - 带过滤器或减法或类似的计数器

标签 python collections filter counter subtraction

我有一个Counter(来自collections)并且想过滤掉一组不需要的项目。结果应该是一个新的 Counter(或者如果你愿意,就地进行)只包含与属性不匹配的项目。我尝试在 Counter 上使用 filter,但结果不再是 Counter,而只是一个 list。我还尝试从 Counter 中减去不需要的项目的 set 但该操作未实现。减去一个 Counter 可行,但我没有第二个 Counter 并且创建它基本上与我要执行的任务相同。

Counter([ 1,2,3,4,5,6,7,6,5,4,3,2,3,4,5,6,5,4,3,4,5,4 ])
→ Counter({4: 6, 5: 5, 3: 4, 6: 3, 2: 2, 1: 1, 7: 1})

现在我想从这个计数器中删除所有的 23 值,所以结果应该是

Counter({4: 6, 5: 5, 6: 3, 1: 1, 7: 1})

这是我的方法:

filter(lambda x: x not in (2, 3), c)
→ [1, 4, 5, 6, 7]

但我不需要列表。

c - set([ 2, 3 ])
→ TypeError: unsupported operand type(s) for -: 'Counter' and 'set'

我可以使用 sth 迭代 Counter 中的解压缩元素列表,如下所示:

Counter(x for x in c.elements() if x not in (2, 3))
→ Counter({4: 6, 5: 5, 6: 3, 1: 1, 7: 1})

但这显然对于大量资金来说是不必要的代价。

我找到的唯一(不是很好)的解决方案是像这样的麻烦:

Counter({ k: v for k, v in c.iteritems() if k not in (2, 3) })

有什么更好、更容易、更具可读性的东西我忽略了吗?

为什么不为 Counter 实现简单的减法运算符,它可以与 set 一起使用?

最佳答案

只需使用del:

>>> c = Counter([ 1,2,3,4,5,6,7,6,5,4,3,2,3,4,5,6,5,4,3,4,5,4 ])
>>> c
Counter({4: 6, 5: 5, 3: 4, 6: 3, 2: 2, 1: 1, 7: 1})
>>> del c[2]
>>> del c[3]
>>> c
Counter({4: 6, 5: 5, 6: 3, 1: 1, 7: 1})
>>>

只是为了好玩,您可以减去另一个具有较大值的 Counter 以删除键,但最好坚持使用 del:

>>> c = Counter([ 1,2,3,4,5,6,7,6,5,4,3,2,3,4,5,6,5,4,3,4,5,4 ])
>>> c
Counter({4: 6, 5: 5, 3: 4, 6: 3, 2: 2, 1: 1, 7: 1})
>>> c - Counter({2:sys.maxint, 3:sys.maxint})
Counter({4: 6, 5: 5, 6: 3, 1: 1, 7: 1})

关于python - 带过滤器或减法或类似的计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18613423/

相关文章:

python - sympy 可以解这些多项式平方根方程吗?

android - 如何在 Android Camera Preview 中创建 Lomo/复古效果?

c# - 视频实时模糊

python - 我正在学习 Python,为什么在此示例中使用浮点?

python - SSL 1108 Mac 问题

java - 使用 last 方法在 Treeset 上并发

c# - Parallel.ForEach 同时保留顺序

scala - 在 Scala 中反转/转置一对多映射

for-loop - 使用 filter() 的惯用方式

python - 应用蒙版阵列 2d 到 3d