合并两个列表或n个元素

时间:2020-08-13 01:54:09

标签: python python-3.x list

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

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'],依此类推

是否有任何pythonic方法来实现这一目标? 到目前为止,我只知道列表理解中n = 1的情况:

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

我不知道如何动态地做到这一点。

3 个答案:

答案 0 :(得分:4)

尝试使用清单理解和一个​​衬里的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']

一些可能的参考:How does zip(*[iter(s)]*n) work in Python?

答案 1 :(得分:0)

使用生成器的替代答案:

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

答案 2 :(得分:-1)

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))
相关问题