trabajos Cómo reducir:
# type annotations:
# reduce(lambda X,X:X, [X,X..]) -> X
# SAME <-- result
# ↗ ↖
# SAME SAME]
# ↗ ↖
# SAME SAME,
# ↗ ↖
# [SAME, SAME,
>>> reduce(lambda a,b:[a,b], [1,2,3,4])
[[[1, 2], 3], 4]
Así es como se reduce con una semilla (también conocida como doblar a la izquierda) funciona:
# type annotations:
# reduce(lambda REDU,ELEM:REDU, [ELEM,ELEM..], seed=REDU) -> REDU
# REDU <-- result
# ↗ ↖
# REDU ELEM]
# ↗ ↖
# REDU ELEM,
# ↗ ↖
# REDU ELEM,
# ↗ ↖
# REDU [ELEM,
>>> reduce(lambda a,b:[a,b], [1,2,3,4], 'seed')
[[[['seed', 1], 2], 3], 4]
que desee:
maxValue,maxIndex = reduce(
lambda p1,p2: max(p1,p2),
((x,i) for i,x in enumerate(yourList))
)
Lo importante a notar acerca de reduce
es los tipos. * Cuando usa reducir (...) con un valor de inicialización (conocido como fold
en otros idiomas), el tipo de devolución será el tipo de semilla. * Cuando usa reduce
normalmente, ignora el elemento semilla. Esto funciona muy bien si todos los elementos de su lista son del mismo tipo (por ejemplo, puede reduce(operator.mul, [1,2,3])
o reduce(operator.add, [1,2,3])
bien, porque el tipo de salida reducido (int) es el mismo que el tipo de entrada no reducida (dos ints)). Sin embargo, el tipo de devolución será el mismo que el tipo del elemento de la lista.
Si los elementos son de diferentes tipos, es necesario utilizar reducir (...) en fold
-mode (es decir, con una semilla con los semántica correctas). (La alternativa es en caso especial su lambda (muy fea).)
Más explícitamente, su tipo de devolución prevista es una tupla (el elemento máximo y su índice, o el reverso). Sin embargo, su función de reducción es del tipo tuple,tuple -> int
. Esto no puede funcionar porque viola el contrato que reduce las demandas de su función.
He votado accidentalmente para cerrar como un duplicado. No es un duplicado, sin embargo. –