如何将元素从list1添加到list2,直到list2结束



例如,如果我有:

list1 = [1, 2, 3]
list2 = [4, 5, 6, 7, 8, 9, 10, 11, 12]

如何在循环中将元素从list1添加到list2,直到list2结束,其中输出变为:

list3 = [1, 4, 2, 5, 3, 6, 1, 7, 2, 8, 3, 9, 1, 10, 2, 11, 3, 12]

您可以使用itertools.cycle循环浏览第一个列表,zip循环浏览两个列表:

>>> from itertools import cycle
>>> [i for pair in zip(cycle(list1), list2) for i in pair]
[1, 4, 2, 5, 3, 6, 1, 7, 2, 8, 3, 9, 1, 10, 2, 11, 3, 12]

如果你想知道发生了什么,你可以查看中间结果:

>>> list(zip(cycle(list1), list2))
[(1, 4), (2, 5), (3, 6), (1, 7), (2, 8), (3, 9), (1, 10), (2, 11), (3, 12)]

您可以删除列表理解,只需使用内置函数即可执行相同的操作:

>>> from itertools import cycle, chain
>>> list(chain(*zip(cycle(list1), list2)))
[1, 4, 2, 5, 3, 6, 1, 7, 2, 8, 3, 9, 1, 10, 2, 11, 3, 12]

如果你真的想长期做这件事:

>>> list3 = []
>>> for pair in zip(cycle(list1), list2):
...     print(f'{pair=}') # just for understanding what's going on
...     for i in pair:
...         list3.append(i)
...
pair=(1, 4)
pair=(2, 5)
pair=(3, 6)
pair=(1, 7)
pair=(2, 8)
pair=(3, 9)
pair=(1, 10)
pair=(2, 11)
pair=(3, 12)
>>> list3
[1, 4, 2, 5, 3, 6, 1, 7, 2, 8, 3, 9, 1, 10, 2, 11, 3, 12]

您可以通过执行以下操作来交错两个数组:

import numpy as np
list1_tiled = np.tile([1, 2, 3], 3)
list2 = np.array([4, 5, 6, 7, 8, 9, 10, 11, 12])
np.ravel(np.column_stack((list1_tiled, list2)))

输出:

array([ 1,  4,  2,  5,  3,  6,  1,  7,  2,  8,  3,  9,  1, 10,  2, 11,  3, 12])

如果您想要一个真正简单的无导入解决方案,您只需连续旋转出第一个list中的第一个元素即可。

list1 = [1, 2, 3]
list2 = [4 ,5 ,6, 7, 8, 9, 10, 11, 12]
list3 = []
for i in list2:
list3.extend([list1[0], i])
# this pops the first element from your list 
# and appends it to the end.
list1.append(list1.pop(0))
print(list3)

这本质上使list1成为一个无限旋转的list,有点像collections.deque

最新更新