Python:从右到左压缩的最快方法是什么,有内置函数吗?

11 投票
6 回答
12979 浏览
提问于 2025-04-17 05:39

给定两个长度不同的序列:

In [931]: a = [1,2,3]
In [932]: b = [4,5,6,7]

这是我想要的结果

In [933]: c = zip(reversed(a),reversed(b))
In [934]: [x for x in reversed(c)]
Out[934]: [(1, 5), (2, 6), (3, 7)]

但是我不喜欢对所有输入参数都使用反转的想法,而且我也不想自己重新实现一个 zip 函数。

所以:

  1. 有没有更快或更有效的方法来做到这一点?
  2. 有没有更简单的方法来做到这一点?

6 个回答

3

下面的代码可以在你不知道哪个列表更长的情况下正常工作:

>>> zip(a[-len(b):], b[-len(a):])
[(1, 5), (2, 6), (3, 7)]

这里有一个关于较小列表的例子:

>>> range(5)[-10:]
[0, 1, 2, 3, 4]

所以即使这个切片看起来有点奇怪,如果你设置了一个负的起始值,而且这个值比列表的长度还要大,它会返回整个列表。

6

我建议:

>>> a = [1,2,3]
>>> b = [4,5,6,7]
>>> k = min(len(a),len(b))
>>> zip(a[-k:], b[-k:])
[(1, 5), (2, 6), (3, 7)]
9

下面这个方法比其他人提供的解决方案更快、更清晰:

s = zip(reversed(a), reversed(b))
s.reverse()                       # in-place

这个 reversed 内置函数会创建一个可以反向遍历的迭代器,它的速度和正向遍历是一样的。这样做不会占用额外的内存(也就是不会生成输入的完整副本),而且也避免了在Python的评估循环中慢慢转圈(其他使用索引的解决方案会遇到这个问题)。

撰写回答