如果比较两个这样的计数器:
counter_a == counter_b
你得到真或假。但是,如果你
是使用reduce
/ operator.eq
来比较它们,
你得到假。有人可以赐教
关于这里发生了什么?
以下是一个例子:
>>> import collections
>>> import operator
>>> a = ['ab', 'ab', 'ab']
>>> b = ['bc', 'ab', 'something']
>>> counters_a = map(collections.Counter, a)
[Counter({'a': 1, 'b': 1}), Counter({'a': 1, 'b': 1}), Counter({'a': 1, 'b': 1})]
>>> counters_b = map(collections.Counter, b)
[Counter({'c': 1, 'b': 1}), Counter({'a': 1, 'b': 1}), Counter({'e': 1, 'g': 1, 'i': 1, 'h': 1, 'm': 1, 'o': 1, 'n': 1, 's': 1, 't': 1})]
>>> counters_a[0] == counters_a[1]
True
>>> counters_b[0] == counters_b[1]
False
>>> reduce(operator.eq, [1, 1, 1])
True
>>> reduce(operator.eq, [1, 1, 2])
False
>>> reduce(operator.eq, counters_b)
**False**
>>> reduce(operator.eq, counters_a)
**False**
答案 0 :(得分:12)
我认为您对reduce
所做的事情感到困惑。根据您的输入,reduce
执行此操作:
((counters_a[0] == counters_a[1]) == counters_a[2])
因此它将布尔值True
或False
与另一个计数器进行比较。计数器从不等于布尔值。 reduce
对前两个元素运行操作,然后获取该操作的结果并将其用作下一个循环的输入,以及列表的下一个元素。
因为Python boolean
类型是int
的子类,所以它恰好适用于1
(True == 1
在{python}中是True
。对所有2
值执行相同操作并且它将失败:
>>> reduce(operator.eq, [2, 2, 2])
False
如果您想测试所有计数器是否相同,请改用all()
:
>>> all(counters_a[0] == c for c in counters_a[1:])
True
>>> all(counters_b[0] == c for c in counters_b[1:])
False