我想以特殊的方式在python中合并两个数组。具有奇数索引的输出数组out
的条目应该是我的第一个输入数组in0
的相应条目。在out
中具有偶数索引的条目应该是我的第二个输入数组in1
的相应条目。
in0
,in1
和out
的长度都相同。
例:
输入数组
in0 = [0, 1, 2, 3]
in1 = [4, 5, 6, 7]
应合并到输出数组
out = [0, 5, 2, 7]
有没有比循环输入整个长度更好的方法并用手填充我的out
?
您可以使用列表推导并从偶数索引中的in0
和奇数索引上的in1
中选择值:
[in0[i] if i % 2 == 0 else in1[i] for i in range(len(in0))]
# [0, 5, 2, 7]
如果您很乐意制作完整列表副本,切片很简单:
>>> in0 = [0, 1, 2, 3]
>>> in1 = [4, 5, 6, 7]
>>> out = in0[:]
>>> out[1::2] = in1[1::2]
>>> out
[0, 5, 2, 7]
如果你不介意一些冗长......
from itertools import cycle
in0 = [0, 1, 2, 3]
in1 = [4, 5, 6, 7]
out = [pair[i] for pair, i in zip(zip(in0, in1), cycle([0,1]))]
这个怎么运作:
zip(in0, in1)
是一系列元组,(0,4), (1,5), (2,6), (3,7)
。cycle([0,1])
是交替的0和1的循环流,用作步骤1中元组的索引。zip(zip(...), cycle(...))
产生一对元组和索引:
(0, (0,4)), (1, (1,5)), (0, (2,6)), (1, (3,7)).
最后,列表理解是一般的版本
[(0,4)[0], (1,5)[1], (2,6)[0], (3,7)[1]]
不使用循环,但不是您所请求的完全相同的顺序:
>> in0 = [0, 1, 2, 3]
>> in1 = [4, 5, 6, 7]
>> out = in0[0::2] + in1[1::2]
>> out
[0, 2, 5, 7]
编辑:使用itertools更正输出顺序:
>> import itertools
>> in0 = [0, 1, 2, 3]
>> in1 = [4, 5, 6, 7]
>> out = list(itertools.chain(*zip(in0[0::2], in1[1::2])))
>> out
[0, 5, 2, 7]