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).
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). –