2012-03-22 5 views
11

¿Hay alguna forma inteligente de escribir una lista de comprensión en más de una lista?Valores de Python de listas múltiples en una comprensión de lista

Sé que podría usar una lista de rango separada como índice, pero de esta manera tengo que saber la longitud (u obtenerla por separado con una llamada a la función len()).

>>> a = range(10) 
>>> b = range(10, 0, -1) 
>>> [(a[x],b[x]) for x in range(10)] 
[(0, 10), (1, 9), (2, 8), (3, 7), (4, 6), (5, 5), (6, 4), (7, 3), (8, 2), (9, 1)] 

Me gustaría tener algo como esto:

>>> [(a,b) for a in range(10) and b in range(10, 0, -1)] 
[(0, 10), (1, 9), (2, 8), (3, 7), (4, 6), (5, 5), (6, 4), (7, 3), (8, 2), (9, 1)] 

¿Cómo escribirías la lista por comprensión? ¿Hay alguna manera de hacer esto con itertools?

La lista de rango solo representa cualquier lista y no necesariamente quiero obtener una tupla. también podría haber una función que toma a y b como parámetros. Entonces zip no es lo que quiero.

ACTUALIZACIÓN: Con "Así que zip no es lo que quiero". Quiero decir que no quiero zip(range(10), range(10, 0, -1))

+0

Duplicado de [9184497] (http://stackoverflow.com/questions/9184497/python-list-comprehension-function-with- arguments-in-two-lists)? – quazgar

Respuesta

20

Su ejemplo es simplemente:

zip(range(10), range(10, 0, -1)) 

De manera más general, puede unirse a cualquier conjunto de iterables usando zip:

[func(a, d, ...) for a, b, ..., n in zip(iterable1, iterable2, ..., iterableN)] 
+1

La segunda solución es lo que quiero. Muchas gracias. – dominik

+0

Es posible que desee considerar ['itertools.izip'] (http://docs.python.org/library/itertools.html#itertools.izip) ya que es mejor en secuencias grandes. La misma idea, solo una herramienta ligeramente diferente. –

+0

Creo que es posible que haya querido escribir '[func (a, b, ...) para a, b, ..., n en zip (iterable1, iterable2, ..., iterableN)]' –

1

Si desea aplicar una función para varias secuencias, necesita map o itertools.imap:

map(lambda *x: sum(x), range(10), range(10, 0, -1), range(0,20, 2)) 

No hay necesidad de comprimir a menos que prefiera hacer su asignación en una lista de comprensión

+0

Eso no es que quiere el. Mira su segundo ejemplo: quiere 'zip'. Y nunca se necesita 'map', una lista de expresión de comprensión/generador puede hacer todo lo posible y más. – agf

+1

@agf "también podría haber una función que tenga a y b como parámetros. Así que zip no es lo que quiero". Podría argumentar que uno tampoco necesita zip, porque el mapa está disponible. – Marcin

+0

Él escribió eso antes de agregar mi segundo ejemplo, que muestra cómo usar una función con 'zip'. Lea su comentario sobre mi respuesta escrita después de que lo agregue. Quería decir que no quería _just_ 'zip', no que no quería' zip' en absoluto. – agf

Cuestiones relacionadas