例如,如果我有:
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
。