在python中,以2的间隔将list元素插入到第二个列表中

在python中,以2的间隔将list元素插入到第二个列表中,python,Python,我想知道如何将列表中的每个元素以2的间隔插入到第二个列表中,第一个元素插入到列表的开头 lis1 = [['g'],['h'],['i']] lis2 = [['a'],['b'],['c'],['d'],['e'],['f']] Expected = [['g'],['a'],['b'],['h'],['c'],['d'],['i'],['e'],['f']] 我的思维过程是将pos设置为2,并在lis1的长度大于0时进行检查,在索引0(第一个索引)处弹出元素并插入lis2,然后移动到下两

我想知道如何将列表中的每个元素以2的间隔插入到第二个列表中,第一个元素插入到列表的开头

lis1 = [['g'],['h'],['i']]
lis2 = [['a'],['b'],['c'],['d'],['e'],['f']]

Expected = [['g'],['a'],['b'],['h'],['c'],['d'],['i'],['e'],['f']]

我的思维过程是将pos设置为2,并在lis1的长度大于0时进行检查,在索引0(第一个索引)处弹出元素并插入lis2,然后移动到下两个位置,但我不确定如何开始或我的思维过程是否可行。

可以使用
链。from_iterable
zip

import itertools

>>> chain = itertools.chain.from_iterable
>>> s = iter(lis2)
>>> list(chain(zip(lis1,s,s)))
[['g'], ['a'], ['b'], ['h'], ['c'], ['d'], ['i'], ['e'], ['f']]

前面的解决方案是正确的,但我发现有一种有趣的不同方法,不使用库:

import itertools


def combine1(l1, l2):
    chain = itertools.chain.from_iterable
    s = iter(lis2)
    return list(chain(zip(lis1, s, s)))


def combine2(l1, l2):
    il2 = iter(l2)
    return [x for t in [(y, next(il2, None), next(il2, None)) for y in l1] for x in t]


lis1 = [['g'],['h']]
lis2 = [['a']]

print("Accepted answer: ", combine1(lis1, lis2))
print("Alternate answer: ", combine2(lis1, lis2))

lis1 = [['g'],['h'],['i']]
lis2 = [['a'],['b']]

print("Accepted answer: ", combine1(lis1, lis2))
print("Alternate answer: ", combine2(lis1, lis2))

lis1 = [['g']]
lis2 = [['a'],['b'],['c'],['d']]

print("Accepted answer: ", combine1(lis1, lis2))
print("Alternate answer: ", combine2(lis1, lis2))

lis1 = [['g'],['h'],['i']]
lis2 = [['a'],['b'],['c'],['d'],['e'],['f']]

print("Accepted answer: ", combine1(lis1, lis2))
print("Alternate answer: ", combine2(lis1, lis2))
不过,这是否正确实际上取决于在
lis1
lis2
中可以找到什么

该脚本的输出:

Accepted answer:  []
Alternate answer:  [['g'], ['a'], None, ['h'], None, None]
Accepted answer:  [['g'], ['a'], ['b']]
Alternate answer:  [['g'], ['a'], ['b'], ['h'], None, None, ['i'], None, None]
Accepted answer:  [['g'], ['a'], ['b']]
Alternate answer:  [['g'], ['a'], ['b']]
Accepted answer:  [['g'], ['a'], ['b'], ['h'], ['c'], ['d'], ['i'], ['e'], ['f']]
Alternate answer:  [['g'], ['a'], ['b'], ['h'], ['c'], ['d'], ['i'], ['e'], ['f']]
请注意,最后一个案例使用示例数据,并且无论哪种方式都具有相同的结果

自提出以来,采用了一种不同且更普遍的方法:

def generate_combine3(l1, l2, n):
    il2 = iter(l2)
    for x in l1:
        yield x
        for _ in range(n):
            yield(next(il2, None))
由于这是一个生成器,要获得与前一个函数完全相同的行为,您需要使用列表包装:

def combine3(l1, l2, n):
    return list(generate_combine3(l1, l2, n))

如果
lis2
的元素少于
lis1
元素的两倍,您希望
lis1
的其余元素附加空列表以分隔它们,还是一起添加?如果
len(lis2)==len(lis1)//2-3
,您会期望
lis2
的最后一个元素是唯一分隔
lis1
的最后两个元素的东西吗?也就是说,您能否给出
lis1=[['g','h','I']的预期结果;lis2=['a'],['b']
和for
lis1=[['g','h'];lis2=[['a']]
?好吧,在我的用例中,lis2的元素永远不会比lis1少,但知道这一点很有意思。Lis 1始终包含LIS2中一半的元素我在下面添加了一些示例和替代解决方案-虽然我不知道itertools,但@rafaelc的解决方案没有问题。工作得很有魅力。谢谢你我喜欢你的思维方式如果您想保留我的答案,请将
zip
更改为
itertools.zip\u longest
,我们将得到相同的答案!有趣的例子和其他包的排除。这似乎更一般,适用于许多其他用例。这是否适用于需要在第二位置以外的位置插入的情况?@Starter与公认的解决方案类似,随着位置数量的增加,您最终会得到更长的语句,例如
列表(链(zip(lis1,s,s,s))
(y,next(il2,None),next(il2,None),next(il2,None))
用于第三个位置。为了概括第n个位置,您可能需要实现一个简单的循环,而不是使用单个表达式或
zip
call.True。即使修改了第n个位置的代码,我也经历过这种情况。