交替合并两个列表n个元素



我有两个长度相同的列表:

list_1 = [1,2,3,4,5,6]
list_2 = ['a','b','c','d','e','f']

我需要将这些基于n的列表合并如下:

  • 如果n=1:result = [1,'a',2,'b',3,'c',4,'d',5,'e',6,'f']
  • 如果n=2:result = [1,2,'a','b',3,4,'c','d',5,6,'e','f']
  • 如果n=3:result = [1,2,3,'a','b','c',4,5,6,'d','e','f']
  • 如果n=4:result = [1,2,3,4,'a','b','c','d',5,6,'e','f'],依此类推

有什么蟒蛇式的方法可以实现这一点吗?到目前为止,我只知道在n=1的情况下做列表理解:

result = [x for sublist in zip(list_1, list_2) for x in sublist]

我不知道如何动态地做。

尝试具有列表理解的itertools(zip_longestchain.from_iterable(,一行代码:

import itertools
def merge(l1, l2, n):
return [j for i in zip(itertools.zip_longest(*[iter(l1)]*n), itertools.zip_longest(*[iter(l2)]*n)) for j in itertools.chain.from_iterable(i) if j]
list_1 = [1, 2, 3, 4, 5, 6]
list_2 = ["a", "b", "c", "d", "e", "f"]
print(merge(list_1, list_2, 2))
# [1, 2, 'a', 'b', 3, 4, 'c', 'd', 5, 6, 'e', 'f']
print(merge(list_1, list_2, 3))
# [1, 2, 3, 'a', 'b', 'c', 4, 5, 6, 'd', 'e', 'f']
print(merge(list_1, list_2, 4))
# [1, 2, 3, 4, 'a', 'b', 'c', 'd', 5, 6, 'e', 'f']

一些可能的参考:zip(*[iter(s(]*n(在Python中是如何工作的?

使用生成器的替代答案:

list_1 = [1,2,3,4,5,6]
list_2 = ['a','b','c','d','e','f']
def merge(a, b, n):
a_index = 0
b_index = 0
while(a_index < len(a)):
for _ in range(n):
yield a[a_index]
a_index +=1
for _ in range(n):
yield b[b_index]
b_index += 1
result = [x for x in merge(list_1, list_2, 1)]
assert result == [1, 'a', 2, 'b', 3, 'c', 4, 'd', 5, 'e', 6, 'f']
result = [x for x in merge(list_1, list_2, 2)]
assert result == [1, 2, 'a', 'b', 3, 4, 'c', 'd', 5, 6, 'e', 'f']
result = [x for x in merge(list_1, list_2, 3)]
assert result == [1,2,3,'a','b','c',4,5,6,'d','e','f']

仅适用于大小相同的列表,并且可能存在更多陷阱。

编辑:只是为了好玩,这里有一个没有管理索引的版本。

def merge(a, b, n):
gen_a = (x for x in a)
gen_b = (x for x in b)
try:
while True:
for _ in range(n):
yield next(gen_a)
for _ in range(n):
yield next(gen_b)
except StopIteration:
pass
def main(order, iArr, sArr):
arr = []
for type in order:
if type == 'i':
arr.append(iArr[0])
iArr.remove(iArr[0])
else:
arr.append(sArr[0])
sArr.remove(sArr[0])
return arr
order1 = ['i', 's', 'i', 's', 'i', 's', 'i', 's', 'i', 's', 'i', 's']
order2 = ['i', 'i', 's', 's', 'i', 'i', 's', 's', 'i', 'i', 's', 's']
order3 = ['i', 'i', 'i', 's', 's', 's', 'i', 'i', 'i', 's', 's', 's']
list_1 = [1,2,3,4,5,6]
list_2 = ['a', 'b', 'c', 'd', 'e', 'f']
print(main(order2, list_1, list_2))

最新更新