我想以一种特殊的方式在python中合并两个数组。
我的输出数组out
的索引为奇数的条目应为我的第一个输入数组in0
的核心对应条目。 out
中具有偶数索引的条目应是我的第二个输入数组的核心响应条目
in1
。
in0
,in1
和out
的长度都相同。
示例:
输入数组
in0 = [0, 1, 2, 3]
in1 = [4, 5, 6, 7]
应合并到输出数组
out = [0, 5, 2, 7]
有没有比遍历输入的整个长度并手动填充out
更好的方法了?
答案 0 :(得分:10)
您可以使用列表推导并从偶数索引的in0
和奇数索引的in1
中选择值:
[in0[i] if i % 2 == 0 else in1[i] for i in range(len(in0))]
# [0, 5, 2, 7]
答案 1 :(得分:7)
如果您愿意制作完整列表副本,可以通过切片操作轻松实现:
>>> in0 = [0, 1, 2, 3]
>>> in1 = [4, 5, 6, 7]
>>> out = in0[:]
>>> out[1::2] = in1[1::2]
>>> out
[0, 5, 2, 7]
答案 2 :(得分:4)
如果您不介意一些冗长的话...
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]]
答案 3 :(得分: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]