【问题标题】:How to reverse tuples in Python? [duplicate]如何在 Python 中反转元组? [复制]
【发布时间】:2012-04-29 10:14:51
【问题描述】:

可能重复:
Traverse a list in reverse order in Python

这可能吗?不必就位,只需寻找一种反转元组的方法,以便我可以反向迭代它。

【问题讨论】:

标签: python loops iteration tuples


【解决方案1】:

您可以使用reversed 内置函数。

>>> x = (1, 2, 3, 4)
>>> x = tuple(reversed(x))
>>> x
(4, 3, 2, 1)

如果你只是想对元组进行迭代,你可以直接使用reversed返回的迭代器,而不用再次转换成元组。

>>> for k in reversed(x):
...     print(k)
... 
4 3 2 1

【讨论】:

  • 是的,这确实通过返回 tuple 完全回答了这个问题
【解决方案2】:

有两种惯用的方法来做到这一点:

reversed(x)  # returns an iterator

x[::-1]  # returns a new tuple

由于元组是不可变的,因此无法就地反转元组。


编辑: 基于@lvc 的评论,reversed 返回的迭代器将等效于

def myreversed(seq):
    for i in range(len(x) - 1, -1, -1):
        yield seq[i]

即它依赖于具有已知长度的序列来避免必须实际反转元组。

至于哪个更有效,我怀疑如果你全部使用它并且元组很小,它会是seq[::-1],当元组很大时,我怀疑它是reversed,但python中的性能是经常令人惊讶所以测量它!

【讨论】:

  • 如果你真的需要构造一个输出元组,那么你需要比较tuple(reversed(x))x[::-1]的性能。如果您只是想以相反的顺序迭代元素,reversed 有更好的机会显示性能改进。
  • reversed 对大元组快 21%,对于小元组慢 3%。由于它更具可读性,我会使用reversed 来处理所有内容。我做了timeit.timeit("for i in x[::-1]: i * i", "x = tuple(range(1000000))", number=1000)timeit.timeit("for i in x[::-1]: i * i", "x = tuple(range(3))", number=100000)
  • 我更喜欢x[::-1],因为它很方便。
  • @tobyodavies 这个很漂亮:x[::-1]。这样的扩展切片在这里得到了很好的解释:docs.python.org/release/2.3.5/whatsnew/section-slices.html.
  • 鉴于输出是list_reverseiteator,这不是问题的直接答案
【解决方案3】:

类似于反转列表的方式,即 s[::-1]

In [20]: s = (1, 2, 3)

In [21]: s[::-1]
Out[21]: (3, 2, 1)

In [24]: for i in s[::-1]:
   ....:     print i
   ....:
3
2
1

【讨论】:

    猜你喜欢
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 2012-10-05
    • 2017-07-30
    • 2016-02-08
    • 2016-02-01
    相关资源
    最近更新 更多