Python: la forma más corta de intercalar elementos de dos listas

9

Estoy tratando de obtener el camino más corto (personaje posible) para obtener la Lista 3.

La Lista 1 y la Lista 2 ya se me dan como argumentos y tienen la misma longitud.

l1 = [1, 2, 3, 4, 5]
l2 = ['a', 'b', 'c', 'd', 'e']

Y la Lista 3 debería verse así (sí, debe ser una lista):

l3 = ['a', 1, 'b', 2, 'c', 3, 'd', 4, 'e', 5]
Matias
fuente
2
¿Su objetivo es, literalmente, la lista de salida específica l3 = ['a', 1, 'b', 2, 'c', 3, 'd', 4, 'e', 5]dada l1 = [1, 2, 3, 4, 5]y l2 = ['a', 'b', 'c', 'd', 'e']ya asignado, o es la idea de que l1y l2podría ser cualquiera de las dos listas de la misma longitud?
xnor

Respuestas:

13

Zip y Sum

[*sum(zip(l2,l1),())]

Pruébalo en línea!

Comprime las dos listas juntas y luego agrega todas las tuplas para hacer una lista combinada. El zip solo funciona si se garantiza que las listas sean del mismo tamaño, de lo contrario trunca la lista más larga.

Se agregó el entorno [* ]para transformarlo en una lista como sugiere FryAmTheEggman.

Jo King
fuente
2
Si usa Python 2, puede usar en listlugar de [* (...) ]+3 bytes.
Erik the Outgolfer
6

Asignación de rebanada

c=a*2
c[1::2]=a
c[::2]=b

Esto es tres bytes más largo que usar la solución de Jo King c=[*sum(zip(b,a),())], pero es ingenioso. Puede ser más corto situacionalmente (aunque no puedo pensar en dónde).

Lynn
fuente