2016-05-18 6 views
7

Am Anfang habe ich 2 Listen und 1 Liste, die in welcher Reihenfolge ich diese beiden Listen zusammenführen soll. Zum Beispiel habe ich die erste Liste gleich [a, b, c] und zweite Liste gleich [d, e] und 'merging' Liste gleich [0, 1, 0, 0, 1].Verschmelze zwei oder mehr Listen mit gegebener Reihenfolge der Zusammenführung

Das bedeutet: um die zusammengeführte Liste zuerst zu machen, muss ich Element aus der ersten Liste nehmen, dann zweite, dann zuerst, dann zuerst, dann zweite ... Und ich lande mit [a, d, b, c, e]. Um dies zu lösen, habe ich nur für die Schleife und zwei "Zeiger" verwendet, aber ich fragte mich, ob ich diese Aufgabe mehr python ... Ich habe versucht, einige Funktionen zu finden, die mir helfen könnten, aber kein wirkliches Ergebnis.

+0

FWIW, gibt es eine Vielzahl von Algorithmen für dieses Problem ist, sowie eine Zeit Skript [Python - ersetzen Sie den Booleschen Wert einer Liste mit den Werten aus zwei verschiedenen Listen ] (http://stackoverflow.com/q/42028606/4014959). –

Antwort

14

Sie könnten Iteratoren aus diesen Listen, Schleife durch die Bestellliste erstellen, und next auf einem der Iteratoren nennen:

i1 = iter(['a', 'b', 'c']) 
i2 = iter(['d', 'e']) 
# Select the iterator to advance: `i2` if `x` == 1, `i1` otherwise 
print([next(i2 if x else i1) for x in [0, 1, 0, 0, 1]]) # ['a', 'd', 'b', 'c', 'e'] 

Es ist möglich, diese Lösung auf eine beliebige Anzahl von Listen unter

wie abgebildet zu verallgemeinern
def ordered_merge(lists, selector): 
    its = [iter(l) for l in lists] 
    for i in selector: 
     yield next(its[i]) 
In [4]: list(ordered_merge([[3, 4], [1, 5], [2, 6]], [1, 2, 0, 0, 1, 2])) 
Out[4]: [1, 2, 3, 4, 5, 6] 

Wenn die Bestellliste Zeichenfolgen enthält, Schwimmern, oder andere Objekte, die können ‚T als Liste Indizes verwendet werden, verwenden Sie ein Wörterbuch:

def ordered_merge(mapping, selector): 
    its = {k: iter(v) for k, v in mapping.items()} 
    for i in selector: 
     yield next(its[i]) 
In [6]: mapping = {'A': [3, 4], 'B': [1, 5], 'C': [2, 6]} 

In [7]: list(ordered_merge(mapping, ['B', 'C', 'A', 'A', 'B', 'C'])) 
Out[7]: [1, 2, 3, 4, 5, 6] 

Natürlich können Sie auch ganze Zahlen als Dictionary-Schlüssel verwenden.


Alternativ können Sie Elemente von der linken Seite von jedem der ursprünglichen Listen eins nach dem anderen und fügen Sie sie in der Ergebnisliste entfernen. Schnell Beispiel:

In [8]: A = ['a', 'b', 'c'] 
    ...: B = ['d', 'e'] 
    ...: selector = [0, 1, 0, 0, 1] 
    ...: 

In [9]: [B.pop(0) if x else A.pop(0) for x in selector] 
Out[9]: ['a', 'd', 'b', 'c', 'e'] 

würde ich der erste Ansatz erwarten, effizienter zu sein (list.pop(0) ist langsam).

2

Wie wäre es damit,

list1 = ['a', 'b', 'c'] 
list2 = ['d', 'e'] 
options = [0,1,0,0,1] 

list1_iterator = iter(list1) 
list2_iterator = iter(list2) 

new_list = [next(list2_iterator) if option else next(list1_iterator) for option in options] 

print(new_list) 
# Output 
['a', 'd', 'b', 'c', 'e'] 
Verwandte Themen