2010-08-12 19 views
22

tengo¿Cómo combino dos listas en una sola lista?

a = [1, 2] 
b = ['a', 'b'] 

Quiero

c = [1, 'a', 2, 'b'] 
+1

@ respuesta de cdleary http://stackoverflow.com/questions/406121/flattening-a-shallow-list-in-python/408281 # 408281 proporciona una comparación de rendimiento para varias formas de "Aplanamiento de una lista superficial en python" (aplanamiento 'zip (a, b)' le da la respuesta). – jfs

Respuesta

44
[j for i in zip(a,b) for j in i] 
+24

Funciona, pero no puedo analizarlo en mi cabeza ... –

+4

[j para j en i para i en zip (a, b)] aunque es más fácil de analizar en mi cabeza no funciona! – sureshvv

+18

Se lee de forma extraña al principio :) Corta mentalmente todo hasta el primer 'for' y muévelo hasta el final, luego lee eso:' para i en zip (a, b) ',' para j en i', ' j'. – shambulator

24

Si el orden de los elementos que coincida tanto el orden en el ejemplo a continuación, se puede utilizar una combinación de zip y chain:

from itertools import chain 
c = list(chain(*zip(a,b))) 

Si no le importa el orden de los elementos en su resultado, entonces hay una manera más simple:

c = a + b 
+1

usando esto en mi caso: 'c = a + b' -> las listas no son iterables. ¿Entonces que? Only chain works verifica mi pregunta para comprender mi problema: 'http: // stackoverflow.com/questions/40952892/extract-url-their-names-of-an-html-file-stored-on-disk-and-print-them-respecti ' –

+0

para índice, fila en datas.iterrows(): textF = re.findall ('{{f}} (*)}}', fila [ 'revisión']) matrixF + = textF si el índice == 3: descanso para el índice en matrixF: imprimir el índice , todavía funciona, por lo que todavía es iterable, ¿no? ._. –

+0

Hay [chain.from_iterable] (https://docs.python.org/3/library/itertools.html#itertools.chain.from_iterable): 'list (chain.from_iterable (zip (a, b)))' - forma perfectamente perezosa de hacer esto. – byashimov

4

Si se preocupan por orden:

#import operator 
import itertools 
a = [1,2] 
b = ['a','b'] 
#c = list(reduce(operator.add,zip(a,b))) # slow. 
c = list(itertools.chain.from_iterable(zip(a,b))) # better. 

print c da [1, 'a', 2, 'b']

+0

-1 para el tiempo cuadrático. Puedes hacer esto en tiempo lineal. – habnabit

+0

@Aaron Gallagher Solución fija, pero una respuesta (sutilmente) única. –

21

de análisis

[j for i in zip(a,b) for j in i] 

en su cabeza es bastante fácil si usted recuerda que el for y if cláusulas se hacen en orden, seguido de un append final del resultado:

temp = [] 
for i in zip(a, b): 
    for j in i: 
     temp.append(j) 

y sería más fácil lo tenían se han escrito con los nombres de variables más significativas:

[item for pair in zip(a, b) for item in pair] 
+0

Normalmente estoy muy cómodo con LEs, pero este doble bucle me confundió a todos. Gracias por la buena explicación. –

5

Un método alternativo utilizando rebanar índice que resulta ser más rápido y mejor que las escalas postal:

def slicezip(a, b): 
    result = [0]*(len(a)+len(b)) 
    result[::2] = a 
    result[1::2] = b 
    return result 

se dará cuenta de que esto sólo funciona si len(a) == len(b) pero pu Las condiciones de prueba para emular zip no se escalarán con aob.

Para la comparación:

a = range(100) 
b = range(100) 

%timeit [j for i in zip(a,b) for j in i] 
100000 loops, best of 3: 15.4 µs per loop 

%timeit list(chain(*zip(a,b))) 
100000 loops, best of 3: 11.9 µs per loop 

%timeit slicezip(a,b) 
100000 loops, best of 3: 2.76 µs per loop 
+0

¿qué quiere decir con "poner condiciones para emular el zip no se escalará con aob"? – sureshvv

+0

Simplemente quise decir que con zip, si una lista es más larga que la otra, la lista más larga se trunca para fusionarla con la lista más corta. Uno podría hacer esto comparando las longitudes de cada matriz y luego solo asignando una versión abreviada de la más larga. Esta comprobación de longitudes y truncamiento no tarda más si las matrices crecen. – SeanM

+0

Nota: Esto funciona bien para fines de bisectriz que favorecen la primera lista: tolera tener la misma longitud o una longitud mayor que la segunda 'slicezip ([1,2,3], [4,5])', lo que significa que no 't tiene que manejar listas desiguales en ese caso (que es muy bueno) – TemporalWolf

0
def main(): 

drinks = ["Johnnie Walker", "Jose Cuervo", "Jim Beam", "Jack Daniels,"] 
booze = [1, 2, 3, 4, 5] 
num_drinks = [] 
x = 0 
for i in booze: 

    if x < len(drinks): 

     num_drinks.append(drinks[x]) 
     num_drinks.append(booze[x]) 

     x += 1 

    else: 

     print(num_drinks) 

return 

principal()

+1

Por favor, tiene que explicar su respuesta. –

+0

¿Se le ocurrió esta respuesta después de 5 rondas? – sureshvv

-2
c = [] 
c.extend(a) 
c.extend(b) 
+1

El resultado deseado es completamente diferente. – vaultah

+0

Si bien este código puede responder a la pregunta, proporcionar un contexto adicional sobre cómo y/o por qué resuelve el problema mejoraría el valor a largo plazo de la respuesta. –

+0

si responde la pregunta y es diferente de todas las otras respuestas, ¿por qué no la admite? Creo que no hay mucho contexto para la pregunta, por lo que cualquier respuesta relevante es bienvenida. –

0

Aquí es una solución estándar/explican por sí mismos, espero que alguien le resultará útil:

a = ['a', 'b', 'c'] 
b = ['1', '2', '3'] 

c = [] 
for x, y in zip(a, b): 
    c.append(x) 
    c.append(y) 

print (c) 

salida:

['a', '1', 'b', '2', 'c', '3'] 

Por supuesto, usted puede cambiarlo y hacer manipulaciones sobre los valores si es necesario

Cuestiones relacionadas