我有一个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})
现在我想从这个计数器中删除所有的 2
和 3
值,所以结果应该是
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/