Buscar..


Sintaxis

  • reducir (función, iterable [, inicializador])

Parámetros

Parámetro Detalles
función Función que se utiliza para reducir lo iterable (debe tomar dos argumentos). ( solo posicional )
iterable iterable que va a ser reducido. ( solo posicional )
inicializador Valor de inicio de la reducción. ( opcional , solo posicional )

Observaciones

reduce podría no ser siempre la función más eficiente. Para algunos tipos hay funciones o métodos equivalentes:

  • sum() para la suma de una secuencia que contiene elementos sumables (no cadenas):

    sum([1,2,3])                                 # = 6
    
  • str.join para la concatenación de cuerdas:

    ''.join(['Hello', ',', ' World'])            # = 'Hello, World'
    
  • next junto con un generador podría ser una variante de cortocircuito en comparación con reduce :

    # First falsy item:
    next((i for i in [100, [], 20, 0] if not i)) # = []  
    

Visión general

# No import needed


# No import required...
from functools import reduce # ... but it can be loaded from the functools module


from functools import reduce # mandatory

reduce reduce un iterable aplicando una función repetidamente en el siguiente elemento de un resultado iterable y acumulativo hasta el momento.

def add(s1, s2):
    return s1 + s2

asequence = [1, 2, 3]

reduce(add, asequence)  # equivalent to: add(add(1,2),3)
# Out: 6

En este ejemplo, definimos nuestra propia función de add . Sin embargo, Python viene con una función equivalente estándar en el módulo del operator :

import operator
reduce(operator.add, asequence)
# Out: 6

reduce también se puede pasar un valor inicial:

reduce(add, asequence, 10)
# Out: 16

Utilizando reducir

def multiply(s1, s2):
    print('{arg1} * {arg2} = {res}'.format(arg1=s1, 
                                           arg2=s2, 
                                           res=s1*s2))
    return s1 * s2

asequence = [1, 2, 3]

Dado un initializer la función se inicia aplicándola al inicializador y al primer elemento iterable:

cumprod = reduce(multiply, asequence, 5)
# Out: 5 * 1 = 5
#      5 * 2 = 10
#      10 * 3 = 30
print(cumprod)
# Out: 30

Sin el parámetro initializer , la reduce inicia al aplicar la función a los dos primeros elementos de la lista:

cumprod = reduce(multiply, asequence)
# Out: 1 * 2 = 2
#      2 * 3 = 6
print(cumprod)
# Out: 6

Producto acumulativo

import operator
reduce(operator.mul, [10, 5, -3])
# Out: -150

Variante sin cortocircuito de alguno / todos.

reduce no terminará la iteración antes de que el iterable se haya iterado completamente, por lo que se puede usar para crear una función sin cortocircuito en any() o all() :

import operator
# non short-circuit "all"
reduce(operator.and_, [False, True, True, True]) # = False

# non short-circuit "any"
reduce(operator.or_, [True, False, False, False]) # = True

Primer elemento verdadero / falso de una secuencia (o último elemento si no hay ninguno)

# First falsy element or last element if all are truthy:
reduce(lambda i, j: i and j, [100, [], 20, 10])    # = []
reduce(lambda i, j: i and j, [100, 50, 20, 10])    # = 10

# First truthy element or last element if all falsy:
reduce(lambda i, j: i or j, [100, [], 20, 0])     # = 100
reduce(lambda i, j: i or j, ['', {}, [], None])   # = None

En lugar de crear una función lambda , generalmente se recomienda crear una función nombrada:

def do_or(i, j):
    return i or j

def do_and(i, j):
    return i and j

reduce(do_or, [100, [], 20, 0])                   # = 100
reduce(do_and, [100, [], 20, 0])                  # = []


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow