9

返品するとしa = [[1,2,3],[1,2,3]] reduce(lambda x,y: x==y, a)ますTrue

でもa = [[1,2,3],[1,2,3],[1,2,3]] reduce(lambda x,y: x==y, a)返品するならFalse

なぜ 2 番目のケースで、結果はFalse?

助けてください

ありがとう

4

6 に答える 6

10

代わりにこれを試してください。任意のサイズのリストで機能します。

all(e == a[0] for e in a)

最初の比較の後の累積値はであり、その時点から各要素と比較することになるため、を使用した提案されたソリューションreduceは 2 つ以上の項目では機能しないことに注意してください。明らかにそれは機能しません。TrueTrue

于 2012-05-23T00:34:13.057 に答える
3

リストを減らしていません。ラムダの戻り値はTrueorFalseであり、同じラムダ関数をさらに呼び出すための入力パラメーターとして使用されます。したがって、ブール値とリストを比較することになります。したがって、縮小関数は、入力パラメーターと同じ型を返す必要があります。

おそらく、代わりに提案された他の回答を探していたでしょう: use all().

于 2012-05-23T00:35:42.707 に答える
2

最初は [1,2,3] == [1, 2, 3] を比較し、次に True と [1,2,3] を比較すると true になるため、false になります。

助ける(減らす)

Help on built-in function reduce in module __builtin__:

reduce(...)
    reduce(function, sequence[, initial]) -> value

    Apply a function of two arguments cumulatively to the items of a sequence,
    from left to right, so as to reduce the sequence to a single value.
    For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates
    ((((1+2)+3)+4)+5).
于 2012-05-23T00:37:28.407 に答える
1

a = [range(1, 4), range(1, 4), range(1, 4)]

関数を評価reduce(operator.eq, a)するには、最初にto getsの最初の 2 つの要素で関数を評価します。次に、とを 2 つの引数として再度呼び出し、 の最終結果であるを取得します。reduceoperator.eqaTrueoperator.eqTruerange(1, 4)Falsereduce

おそらくあなたが望んでいる:

from functools import partial
import operator
allequal = reduce(partial(operator.eq, a[0]), a[1:])
于 2012-05-23T00:40:27.187 に答える
0

2 番目のケースで結果が False になる理由

reduce(lambda x, y: x == y, (a, b, c, d))という意味ではないので(a == b) and (b == c) and (c == d); それは意味し(((a == b) == c) == d)ます。はまたはのa == bいずれかを生成し、それを と比較します。TrueFalsec

于 2012-05-23T00:54:34.733 に答える