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:这就是为什么我在上面问过当一个列表比另一个列表长时该怎么办。我喜欢这个列表,因为它很简单-唯一要解决的是不要修改ximport 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']