3

次のように 2 つのカウンターを比較すると、次のようになります。

counter_a == counter_b

True または False のいずれかを取得します。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])

Trueそのため、ブール値またはFalse別のカウンターと比較します。カウンターがブール値と等しくなることはありません。reduce最初の 2 つの要素に対して操作を実行し、その操作の結果を取得して、リストの次の要素と共に次のループの入力として使用します。

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 に答える