Pythonischer Weg, zwei Listen zu mischen

8

Ich habe zwei Listen der Länge n und n + 1:

%Vor%

Ich möchte eine Funktion, die als Ergebnis eine Liste mit alternativen Elementen aus den beiden gibt, das heißt

%Vor%

Folgendes funktioniert, sieht aber nicht schick aus:

%Vor%

Kann jemand eine pythischere Art vorschlagen, dies zu tun? Danke!

    
Giulia 23.09.2011, 13:03
quelle

9 Antworten

11

IMHO der beste Weg ist:

%Vor%

Es ist auch schneller als Summe und reduziert Wege.

UPD Sorry, dass deine zweite Liste um ein Element größer ist :) Es gibt einen anderen verrückten Weg:

%Vor%     
Mikhail Churbanov 23.09.2011, 13:15
quelle
15
%Vor%

zip() erzeugt ein iterables Argument mit der Länge des kürzesten Arguments. Sie können a[-1] entweder an das Ergebnis anhängen oder itertools.zip_longest (izip_longest für Python 2.x) mit einem Füllwert verwenden und diesen Wert anschließend löschen.

Und Sie können mehr als zwei Eingabesequenzen mit dieser Lösung verwenden.

Wenn Sie den letzten Wert nicht anhängen, können Sie diesen dreckigen Ansatz versuchen, aber ich empfehle es nicht wirklich, es ist nicht klar:

%Vor%

(Für Python 2.x verwenden Sie einfach / )

    
utdemir 23.09.2011 13:06
quelle
4
%Vor%     
Jin 23.09.2011 13:13
quelle
3

das Mischen von zwei Listen ist ein Job für zip :

%Vor%

für Listen unterschiedlicher Länge, definieren Sie Ihre eigene Funktion:

%Vor%

mit der Antwort von Mihail gegeben können wir verkürze dies zu:

%Vor%     
Adrien Plisson 23.09.2011 13:07
quelle
2

Ich würde eine Kombination der obigen Antworten verwenden:

%Vor%     
zeekay 23.09.2011 13:38
quelle
1
%Vor%

Hinweis: Dies funktioniert nur für Ihre angegebenen Listenlängen, kann aber leicht auf Listen beliebiger Länge erweitert werden.

    
phimuemue 23.09.2011 13:09
quelle
1

Verwenden Sie izip_longest , um die Lücken mit etwas zu füllen, das Sie nicht in Ihren Listen haben oder nicht im Ergebnis behalten möchten. Wenn Sie nichts in False auflösen möchten, verwenden Sie die Standardwerte für izip_longest und filter :

%Vor%

Das Ergebnis ist: [1, 2, 3, 4, 5, 6, 8, 10]

Verwenden von None zum Füllen der Lücken und Entfernen von Lücken mit filter :

%Vor%

Für eine bessere Effizienz, wenn l1 oder l2 keine kurzen Listen sind, sondern z.B. Sehr lange oder unendliche Iterables, anstatt filter use ifilter , was Ihnen ein iterables ergibt, anstatt alles im Speicher in einer Liste zu speichern. Beispiel:

%Vor%     
Ivan Ogai 08.06.2014 12:45
quelle
0

Sie könnten etwas wie folgt machen (unter der Annahme len(list_long)==len(list_short)+1 :

%Vor%

Wo ich / für Ganzzahldivision verwende (genau was der Operator ist, hängt von der Sprachversion ab).

    
murgatroid99 23.09.2011 13:08
quelle
-1

Verwenden Sie zip. Das wird Ihnen eine Liste von Tupeln geben, wie: [(a_1, b_1), (a_2, b_2), (a_3, b_3)]

Wenn Sie das in eine nette Liste aufräumen wollen, iterieren Sie einfach die Liste der Tupel mit enumerate:

%Vor%     
Canuteson 23.09.2011 13:22
quelle

Tags und Links