python合并两个列表(偶数/奇数元素)

python合并两个列表(偶数/奇数元素),python,list,merge,Python,List,Merge,给定两个列表,我想合并它们,以便第一个列表中的所有元素都被偶数索引(保留它们的顺序),第二个列表中的所有元素都被奇数索引(也保留它们的顺序)。示例如下: x = [0,1,2] y = [3,4] result = [0,3,1,4,2] 我可以用for循环来做。但我想可能会有一种奇特的pythonic方法来实现这一点(使用一个鲜为人知的函数或类似的东西)。编写for循环有更好的解决方案吗 编辑:我在考虑列表的理解,但到目前为止还没有找到任何解决方案。这里有一些你可以使用的东西。(对Py2x

给定两个列表,我想合并它们,以便第一个列表中的所有元素都被偶数索引(保留它们的顺序),第二个列表中的所有元素都被奇数索引(也保留它们的顺序)。示例如下:

x = [0,1,2]
y = [3,4]

result = [0,3,1,4,2]
我可以用for循环来做。但我想可能会有一种奇特的pythonic方法来实现这一点(使用一个鲜为人知的函数或类似的东西)。编写for循环有更好的解决方案吗


编辑:我在考虑列表的理解,但到目前为止还没有找到任何解决方案。

这里有一些你可以使用的东西。(对Py2x使用
列表(izip_最长(…)

这适用于任意长度的列表,如下所示-

>>> x = [0, 1, 2, 3, 4]
>>> y = [5, 6]
>>> list(filter(lambda x: x != '', chain.from_iterable(zip_longest(x, y, fillvalue = ''))))
[0, 5, 1, 6, 2, 3, 4]
对其工作原理的解释-

  • zip_longest(…)
    带有填充值的压缩列表,并为长度不等的列表填充给定的填充值。因此,对于您最初的示例,它的计算结果类似于
    [(0,3)、(1,4)、(2',)]
  • 我们需要将结果展平,因为这个方法会给我们一个元组列表。为此,我们使用了
    chain.from_iterable(…)
    为我们提供了类似
    [0,3,1,4,2',][
  • 现在,我们使用
    过滤器(…)
    删除所有出现的
    '
    ,并得到所需的答案
  • 试试这个:

    x = [0,1,2,10,11]
    y = [3,4]
    
    n =  2*max([len(x),len(y)])
    res = n *[None]
    res[:2*len(x):2] = x
    res[1:2*len(y):2] = y
    res = [x for x in res if x!=None]
    print res
    

    它应该适用于长度不均匀的列表。

    使用以下
    循环:

    您可以简单地执行以下操作:

    for i,v in enumerate(y):
        x.insert(2*i+1,v)
    
    这样做的好处是insert将在跨越最后一个索引时使用它

    一个例子:

    x = [0,1,2,3,4,5]
    y = [100, 11,22,33,44,55,66,77]
    print x
    # [0, 100, 1, 11, 2, 22, 3, 33, 4, 44, 5, 55, 66, 77]
    

    这很简单,尽管不如
    roundrobin
    灵活:

    def paired(it1, it2):
        it2 = iter(it2)
        for item in it1:
            yield item
            yield next(it2)
    
    在2.7.5中测试:

    >>> x = [0, 1, 2]
    >>> y = [3, 4]
    >>> print list(paired(x, y))
    [0, 3, 1, 4, 2]
    

    请注意,列表
    y
    一用完,它就会停止(因为
    next(it2)
    会引发StopIteration)。

    如果列表长度相同,可以使用以下方法:

    result = [ item for tup in zip(x,y) for item in tup ]
    

    它可以通过切片来完成。在终端中进行
    计数
    切片

    >>> list1=['Apple','Mango','Orange']
    >>> list2=['One','Two','Three']
    >>> list = [None]*(len(list1)+len(list2))
    >>> list[::2] = list1
    >>> list[1::2] = list2
    >>> list
    
    输出:

     ['Apple', 'One', 'Mango', 'Two', 'Orange', 'Three']
    

    你想为
    x=[0,1,2,3,4,5,6]
    但是
    y=[20,21]
    做什么,或者反过来?(即,如果一个列表比另一个列表长或短得多怎么办?)假设更简单的场景:len(x)==len(y)或len(x)==len(y)+1,所以不用担心。这将是一个游戏的一系列动作。在这种情况下,使用如下
    roundrobin
    ,或简化版本。@nio为什么删除答案?到目前为止,我最喜欢它(最短、最简单)@torek,下面的答案中建议的方法在列表较长或较短的情况下有效……是的,但是——正如我在问题中所写的那样——我可以只使用for循环。我在考虑一些基于语法的东西(比如列表切片或列表理解)。无论如何,谢谢这会错过一些项目:
    paired(y,x)
    @AshwiniChaudhary:这就是为什么我在上面问过当一个列表比另一个列表长时该怎么办。我喜欢这个列表,因为它很简单-唯一要解决的是不要修改x
    import copy
    /
    res=copy.copy(x)
    /
    对于枚举(y)中的i,v:
    /
    res.insert(2*i+1,v)
    @tkoomzaaskz
    列表。insert
    是一个O(N)操作。@ashwinichaudhar你是指复杂性吗?那又怎么样?(如果我不理解你的观点,很抱歉)@tkoomzaaskz是的复杂性,对于将每个项目插入
    x
    它将执行
    O(N)
    步骤。因此,这个解决方案的总体复杂性是
    O(len(y)*len(x))
    ,而其他解决方案只是
    O(len(x)+len(y))
    。对于大型列表,这将非常缓慢。@tkoomzaaskz:只是一些
    timeit
    结果。(设置-两个列表,一个长度为100,一个长度为50,迭代次数=5000,Py2x)Saullo的解决方案-
    44.59869242355262
    ,Ashwini的解决方案-
    0.36575645629210385
    ,我的解决方案-
    0.5685753073638011
    。Nio的解决方案-
    0.21236540710697227
    。对于len(x)=len(y)+1:
    列表(链从(zip(x,y))+[x[-1]
    >>> list1=['Apple','Mango','Orange']
    >>> list2=['One','Two','Three']
    >>> list = [None]*(len(list1)+len(list2))
    >>> list[::2] = list1
    >>> list[1::2] = list2
    >>> list
    
     ['Apple', 'One', 'Mango', 'Two', 'Orange', 'Three']