Siz bu listelerden iterators oluşturmak, sipariş listesinde döngü ve Yineleyicilerin birinde next
diyebiliriz:
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']
O
aşağıda gösterildiği gibi listelerde herhangi bir sayıda bu çözümü genellemek mümkündür
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]
sipariş listesi dizeleri içeriyorsa , yüzen ya da herhangi bir diğer nesneler o can
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]
Tabii ki, siz de sözlük tuşları olarak tamsayılar kullanabilirsiniz: 't bir sözlük kullanın liste indeks olarak kullanılabilir.
Alternatif olarak, tek orijinal listelerinden biri her birinin sol taraftan öğeleri kaldırmak ve elde edilen listeye ekleyebilirsiniz. Hızlı örnek:
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']
I (list.pop(0)
yavaş olan) Birinci yaklaşım daha verimli olması beklenebilir.
FWIW, ya bu, bu sorun için algoritmaların çeşitli yanı sıra [piton bir zamanlama komut vardır Nasıl - İki farklı listelerden değerleriyle bir listenin boole değerini değiştirmek ] (http://stackoverflow.com/q/42028606/4014959). –