用Pythonic方式合并两个列表
我有两个列表,一个长度是 n,另一个长度是 n+1:
[a_1, a_2, ..., a_n]
[b_1, b_2, ..., b_(n+1)]
我想要一个函数,能够返回一个新列表,这个新列表的元素是从这两个列表中交替取出来的,也就是说:
[b_1, a_1, ..., b_n, a_n, b_(n+1)]
下面这个方法可以实现,但看起来不太聪明:
def list_mixing(list_long,list_short):
list_res = []
for i in range(len(list_short)):
list_res.extend([list_long[i], list_short[i]])
list_res.append(list_long[-1])
return list_res
有没有人能推荐一个更符合 Python 风格的方法来做到这一点?谢谢!
12 个回答
4
在编程中,有时候我们需要把一些数据从一个地方转移到另一个地方。这就像把水从一个杯子倒到另一个杯子一样。我们可以用不同的方法来做到这一点,比如使用变量、数组或者其他的数据结构。
变量就像是一个小盒子,我们可以把数据放进去,随时取出来。数组则是一个可以装很多盒子的大盒子,里面可以放很多数据。这样我们就可以更方便地管理和使用这些数据。
在编程时,我们还会用到一些工具和函数,帮助我们更高效地处理这些数据。就像在厨房里,我们会用刀、锅等工具来做饭,编程也是一样,有很多工具可以帮助我们完成任务。
总之,数据的转移和管理是编程中非常重要的一部分,掌握这些基本概念后,我们就能更好地进行编程了。
>>> long = [1, 3, 5, 7]
>>> short = [2, 4, 6]
>>> mixed = []
>>> for i in range(len(long)):
>>> mixed.append(long[i])
>>> if i < len(short)
>>> mixed.append(short[i])
>>> mixed
[1, 2, 3, 4, 5, 6, 7]
18
>>> import itertools
>>> a
['1', '2', '3', '4', '5', '6']
>>> b
['a', 'b', 'c', 'd', 'e', 'f']
>>> list(itertools.chain.from_iterable(zip(a,b)))
['1', 'a', '2', 'b', '3', 'c', '4', 'd', '5', 'e', '6', 'f']
zip()
函数会生成一个可迭代的对象,它的长度是输入中最短的那个。如果你想把最后一个值加到结果里,可以在结果后面加上 a[-1]
,或者使用 itertools.zip_longest
(在 Python 2.x 中用 izip_longest
),并设置一个填充值,最后再把这个填充值删掉。
这个方法还可以处理多个输入序列,不仅仅是两个。
如果你不想加最后一个值,可以尝试一种不太好的方法,但我不太推荐,因为这样做不太清晰:
>>> a
[1, 2, 3, 4, 5]
>>> b
['a', 'b', 'c', 'd', 'e', 'f']
>>> [a[i//2] if i%2 else b[i//2] for i in range(len(a)*2+1)]
['a', 1, 'b', 2, 'c', 3, 'd', 4, 'e', 5, 'f']
(对于 Python 2.x,使用单个 /
)
14
在我看来,最好的方法是:
result = [item for sublist in zip(a,b) for item in sublist]
这个方法比用求和和归约的方式要快。
更新 抱歉,我刚才没注意到你的第二个列表多了一个元素 :)
还有一种很疯狂的方法:
result = [item for sublist in map(None, a, b) for item in sublist][:-1]