3

如果您像这样比较两个计数器:

counter_a == counter_b

你得到真或假。reduce但是,如果您要使用/比较它们operator.eq,则会得到 False。有人可以告诉我这里发生了什么吗?

这是一个例子:

>>> 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**
4

1 回答 1

12

我认为您对做什么感到reduce 困惑。鉴于您的输入,请reduce执行以下操作:

((counters_a[0] == counters_a[1]) == counters_a[2])

所以它比较一个布尔值TrueFalse另一个计数器。计数器从不等于布尔值。reduce对前两个元素运行操作,然后获取该操作的结果并将其与列表的下一个元素一起用作下一个循环的输入。

因为 Pythonboolean类型是 的子类int,所以它恰好适用于1( True == 1is Truein python)。对所有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
于 2013-02-09T11:50:45.920 回答