2012-05-23 10 views

Respuesta

7

Prueba este lugar, funciona para listas de cualquier tamaño:

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

en cuenta que la solución propuesta mediante reduce no funciona desde hace más de dos artículos , ya que el valor acumulado después de la primera comparación es True, y estaría comparando True con cada uno de los elementos a partir de ese momento, y obviamente eso no va a funcionar.

+0

seguro. de hecho estoy haciendo el más simple 'a [1:] == a [: - 1]' funciona, pero mi pregunta es por qué 'reduce' produce resultados inesperados como se muestra en mi pregunta? – Jack

+1

@Jack no, eso no es lo que estás haciendo. Ver mi respuesta editada. –

+0

Funciona también para listas vacías. –

2

Usted es no reduciendo las listas. El valor de retorno de su lambda es True o False, que luego se usa como parámetros de entrada para otras llamadas a la misma función lambda. Entonces terminas comparando un booleano con una lista. Por lo tanto, la función reductora debería devolver el mismo tipo que los parámetros de entrada.

Probablemente esté buscando qué otras respuestas se proponen en su lugar: use all().

1

Porque la primera vez reduce la comparación [1,2,3] == [1, 2, 3] y es verdadera la próxima vez que compare True y [1,2,3] y es falsa.

ayuda (reducir)

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). 
1

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

Para evaluar la función reduce(operator.eq, a)reduce primero evaluará la función operator.eq en el abeto st dos elementos de a para obtener True. Luego llamará a operator.eq nuevamente con True y range(1, 4) como los dos argumentos, y obtendrá False que es el resultado final de reduce.

Tal vez usted está deseando:

from functools import partial 
import operator 
allequal = reduce(partial(operator.eq, a[0]), a[1:]) 
0

¿Por qué en el segundo caso, el resultado es falso

Debido reduce(lambda x, y: x == y, (a, b, c, d)) no significa (a == b) and (b == c) and (c == d); significa (((a == b) == c) == d). a == b producirá True o False, que luego se compara con c.

Cuestiones relacionadas