2017-07-27 151 views
2

幾乎所有我看到的問題都是:這個問題更多地是關於連接或者做某些事情,比如在列表中的元素之間添加空格。將一個列表的元素添加到另一個列表中的特定位置:Python

假設我有:

a = [1, 3, 5, 7, 9] 
b = [2, 4, 6, 8, 10] 

我想在B中的元件在各元素後面要追加,所以我將與c = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]結束。我將如何去做這件事?

回答

2

itertools有一個roundrobin食譜,但這對你的例子來說有點矯枉過正,但確實適用於不相等的長度。
對於長度相等的子列表,那麼所有你需要做的是zip()和扁平:

>>> [n for p in zip(a, b) for n in p] 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 

或者使用itertools.chain.from_iterable

>>> import itertools as it 
>>> list(it.chain.from_iterable(zip(a, b))) 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 

或者,你可以寫你自己的發電機:

def gen(a, b): 
    for x, y in zip(a, b): 
     yield x 
     yield y 

>>> list(gen(a, b)) 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
+0

我喜歡的想法生成器但zip()分配一個列表哪種類型的目的失敗 –

+1

@minitotent'zip()'不在Py3中分配一個列表,它相當於Py2中的'itertools.izip()'。 – AChampion

+0

哦,我的壞,我查了python2版本,+1相關的發電機 –

2

使用insert()循環工作,並且相對簡單:

for i in range(len(a)): 
    a.insert(2*(i)+1, b[i]) 

注list.insert()需要移動,以後每列表條目在內存返回一個位置,這是大名單,一個deque從collections.deque(想想雙向鏈表)相當低效可能是一個更好的選擇。

如果你想分配一個新的列表:

c = [] 
for i in range(len(a)): 
    c.append(a[i]) 
    c.append(b[i]) 

還要注意的是該具體實施方式僅適用於等長的名單。

3
c = [] 
for i in range(len(a)): 
    c.append(a[i]) 
    c.append(b[i]) 

這將需要a是相同的長度b。如果它們不同,你將不得不稍微補充一點,但這是相同的想法。

如果你的目標只是希望得到既ab的排序列表...

c = sorted(list(set().union(a, b))) 
1

可能是這樣可以幫助...

def alternateListInsert(a,b): 
    fIndex = 1 
    for i in range(len(b)): 
     a.insert(fIndex,b[i]); 
     fIndex += 2 

    return a 
相關問題