python - python中的计数器可以这样比较吗?

标签 python collections comparison counter reduce

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

counter_a == counter_b

您得到 True 或 False。但是,如果你 使用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**

最佳答案

我认为您对reduce的作用感到困惑。根据您的输入,reduce 执行以下操作:

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

因此它将 bool 值 TrueFalse 与另一个计数器进行比较。计数器从不等于 bool 值。 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

关于python - python中的计数器可以这样比较吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14787787/

相关文章:

Java:将差异计数作为 int 返回的字符串比较库?

python - 为什么在写入 csv 文件以及添加到列表时,数字字符串和字符串文本(波斯语)的顺序会发生变化?

python - 如何使 python 数据类可哈希?

python - 如何按列的绝对值对numpy数组进行排序?

Python 类型检查器 mypy : subprocess. STARTUPINFO 未定义

java - Java 中的迭代器

javascript - Meteor js - 模板 : multiple collections

mongodb - 将 MongoDB 集合存储在不同的驱动器上

python - 比较两个列表,然后说出列表中某个项目匹配的次数

mysql - 获取MySQL中的不同列