2011-04-13 14 views
7

¿Hay una orden interna del pitón que hace lo mismo que Tupler para un conjunto de listas, o algo similar:¿Hay un pitón incorporado para crear tuplas de múltiples listas?

def tupler(arg1, *args): 
    length = min([len(arg1)]+[len(x) for x in args]) 
    out = [] 
    for i in range(length): 
     out.append(tuple([x[i] for x in [arg1]+args])) 
    return out 

así, por ejemplo:

tupler([1,2,3,4],[5,6,7]) 

devuelve:

[(1,5),(2,6),(3,7)] 

o tal vez hay una forma propia de pitón de hacer esto, ¿o hay un generador similar?

+2

También eche un vistazo al módulo itertools. itertools.izip() e itertools.izip_longest() devuelven iterador eficiente de memoria logrando el mismo resultado que zip. – sateesh

Respuesta

15

creo que estás buscando zip():

 
>>> zip([1,2,3,4],[5,6,7]) 
[(1, 5), (2, 6), (3, 7)] 
5

echar un vistazo a la función integrada de cremallera http://docs.python.org/library/functions.html#zip

también puede manejar más de dos listas, digamos n, y luego crea n-tuplas.

>>> zip([1,2,3,4], [5,6,7,8], [9,10,11,12], [13,14]) 
[(1, 5, 9, 13), (2, 6, 10, 14)] 
2
zip([1,2,3,4],[5,6,7]) 

--->[(1,5),(2,6),(3,7)] 


args = [(1,5),(2,6),(3,7)] 

zip(*args) 

--->[1,2,3],[5,6,7] 
0

La forma correcta es utilizar la función zip.

Alternativamente, podemos usar la lista de comprehensiones y la función incorporada enumerate
para lograr el mismo resultado.

>>> L1 = [1,2,3,4] 
>>> L2 = [5,6,7] 
>>> [(value, L2[i]) for i, value in enumerate(L1) if i < len(L2)] 
[(1, 5), (2, 6), (3, 7)] 
>>> 

El inconveniente en el ejemplo anterior es que no siempre iterar sobre la lista con la longitud mínima.

Cuestiones relacionadas