2016-05-18 28 views
7

Başlarken İki listeyi ve bu iki listeyi hangi sırayla birleştirmem gerektiğini söyleyen 1 liste var. Örneğin, ilk liste [a, b, c]'a eşittir ve ikinci liste [d, e] ve "birleştirme" listesine eşittir [0, 1, 0, 0, 1].Birleştirme sırasına göre iki veya daha fazla listeyi birleştirin

Bunun anlamı: önce birleştirilmiş liste oluşturmak için önce birinci listeden eleman almam, sonra ikincisi, sonra ilk önce, sonra ikincisi ... Ve ben [a, d, b, c, e] ile bitiyorum. Bunu çözmek için sadece döngü ve iki "işaretçi" için kullandım, ama bu görevi daha çok ses yazabilirmiyiz diye merak ediyordum ... Bana yardımcı olabilecek bazı işlevler bulmaya çalıştım ama gerçek bir sonuç yok.

+0

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

cevap

14

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.

2

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'] 
İlgili konular