Python:从右到左压缩的最快方法是什么,有内置函数吗?
给定两个长度不同的序列:
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 函数。
所以:
- 有没有更快或更有效的方法来做到这一点?
- 有没有更简单的方法来做到这一点?
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的评估循环中慢慢转圈(其他使用索引的解决方案会遇到这个问题)。