幾乎所有我看到的問題都是:這個問題更多地是關於連接或者做某些事情,比如在列表中的元素之間添加空格。將一個列表的元素添加到另一個列表中的特定位置: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]
結束。我將如何去做這件事?
幾乎所有我看到的問題都是:這個問題更多地是關於連接或者做某些事情,比如在列表中的元素之間添加空格。將一個列表的元素添加到另一個列表中的特定位置: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]
結束。我將如何去做這件事?
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]
使用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])
還要注意的是該具體實施方式僅適用於等長的名單。
c = []
for i in range(len(a)):
c.append(a[i])
c.append(b[i])
這將需要a
是相同的長度b
。如果它們不同,你將不得不稍微補充一點,但這是相同的想法。
如果你的目標只是希望得到既a
和b
的排序列表...
c = sorted(list(set().union(a, b)))
可能是這樣可以幫助...
def alternateListInsert(a,b):
fIndex = 1
for i in range(len(b)):
a.insert(fIndex,b[i]);
fIndex += 2
return a
我喜歡的想法生成器但zip()分配一個列表哪種類型的目的失敗 –
@minitotent'zip()'不在Py3中分配一個列表,它相當於Py2中的'itertools.izip()'。 – AChampion
哦,我的壞,我查了python2版本,+1相關的發電機 –