Python: najkrótszy sposób na przeplatanie elementów z dwóch list

9

Próbuję uzyskać najkrótszą drogę (możliwa postać) do uzyskania listy 3.

Lista 1 i Lista 2 są już podane jako argumenty i mają tę samą długość.

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

Lista 3 powinna wyglądać (tak, musi to być lista):

l3 = ['a', 1, 'b', 2, 'c', 3, 'd', 4, 'e', 5]
Matias
źródło
2
Czy Twoim celem jest dosłownie wyprowadzenie l3 = ['a', 1, 'b', 2, 'c', 3, 'd', 4, 'e', 5]podanej l1 = [1, 2, 3, 4, 5]i l2 = ['a', 'b', 'c', 'd', 'e']już przypisanej konkretnej listy , czy też jest to pomysł l1i l2mogą to być dowolne dwie listy o tej samej długości?
xnor

Odpowiedzi:

13

Zip and Sum

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

Wypróbuj online!

Zasuwa dwie listy razem, a następnie dodaje wszystkie krotki, aby utworzyć jedną połączoną listę. Zip działa tylko wtedy, gdy listy mają taki sam rozmiar, w przeciwnym razie przycina dłuższą listę.

Dodano otoczenie, [* ]aby przekształcić je w listę, jak sugeruje FryAmTheEggman.

Jo King
źródło
2
Jeśli używasz Python 2, możesz po prostu użyć listzamiast [* (...) ]+3 bajtów.
Erik the Outgolfer
7

Przydział plasterków

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

To trzy bajty dłużej niż przy użyciu rozwiązania Jo Kinga c=[*sum(zip(b,a),())], ale jest fajne. Sytuacja może być krótsza (choć nie wiem, gdzie).

Lynn
źródło