给定两个列表,我想合并它们,以便第一个列表中的所有元素都是偶数索引(保留它们的顺序),第二个列表中的所有元素都是奇数索引(也保留它们的顺序)。示例如下:
x = [0,1,2]
y = [3,4]
result = [0,3,1,4,2]
我可以使用for循环来完成它。但我想可能有一种奇特的pythonic方式(使用一个鲜为人知的函数或类似的东西)。有没有更好的解决方案,写一个for循环?
编辑:我正在考虑列表推导,但到目前为止还没有提出任何解决方案。
答案 0 :(得分:8)
这是你可以使用的东西。 (对{Py2x使用list(izip_longest(...))
)
>>> from itertools import chain
>>> from itertools import zip_longest
>>> list(filter(lambda x: x != '', chain.from_iterable(zip_longest(x, y, fillvalue = ''))))
[0, 3, 1, 4, 2]
这适用于任意长度的列表,如下所示 -
>>> 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, '']
。filter(...)
删除所有''
,我们会得到所需的答案。答案 1 :(得分:5)
使用recipe中的roundrobin
itertools:
from itertools import cycle, islice
def roundrobin(*iterables):
"roundrobin('ABC', 'D', 'EF') --> A D E B F C"
# Recipe credited to George Sakkis
pending = len(iterables)
nexts = cycle(iter(it).next for it in iterables)
while pending:
try:
for next in nexts:
yield next()
except StopIteration:
pending -= 1
nexts = cycle(islice(nexts, pending))
>>> list(roundrobin(x,y))
[0, 3, 1, 4, 2]
答案 2 :(得分:4)
试试这个:
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
它应该适用于长度不均匀的列表。
答案 3 :(得分:4)
您可以这样做:
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]
答案 4 :(得分:3)
如果您有相同的长度列表,可以使用:
result = [ item for tup in zip(x,y) for item in tup ]
答案 5 :(得分:2)
虽然不像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)。
答案 6 :(得分:1)
可以使用切片完成。在终端中执行count
和slice
:
>>> 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']