Python:从右到左拉链的最快方法是什么,是不是内置了?

Ale*_*dio 6 python built-in

给出2个不同长度的序列:

In [931]: a = [1,2,3]
In [932]: b = [4,5,6,7]
Run Code Online (Sandbox Code Playgroud)

这就是我要的

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

但是我不喜欢在所有输入参数上使用reverse的想法,我也不想重新实现我自己的zip函数.

所以:

  1. 是否有更快/更有效的方法来做到这一点?
  2. 有更简单的方法吗?

sam*_*var 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)]
Run Code Online (Sandbox Code Playgroud)


Ray*_*ger 6

以下内容比其他发布的解决方案更快更清晰:

s = zip(reversed(a), reversed(b))
s.reverse()                       # in-place
Run Code Online (Sandbox Code Playgroud)

逆转内置创建以相同的速度向前迭代的迭代器这些循环倒退.不会产生额外的内存(输入的完整副本),并且Python eval-loop周围没有慢速跳转(存在于使用指示的其他解决方案中).

  • 在Python 3中,*zip*返回一个迭代器,所以你可以在一次传递中完成所有操作,只在最后转换为一个列表:``list(reverse(zip(reverse(a),reversed(b)))) ``. (2认同)
  • **reversed()** 只接受一个序列,无论使用什么版本的 Python。然后在 Python 2.x 中,它是 ``list(reversed(zip(reversed(a), reversed(b)) ))`` 但在 Python 3.x 中它是 ``list(reversed(list(zip(reversed) (a),reverse(b)))))`` 所以在这两种情况下,使用单行时需要创建一个中间新列表。 (2认同)