如何在Python中反向迭代列表?


请参见:如何获得列表的反向副本(避免在.reverse后链接方法时使用单独的语句)?


当前回答

要反转相同的列表,请使用:

array.reverse()

将反向列表赋值到其他列表使用:

newArray = array[::-1] 

其他回答

另一种方法使用列表理解和abs

array = [0, 10, 20, 40]

reversed_array = [array[abs(indx)] for indx in range(abs(len(array)-1),1)]
            
reversed_array
[40, 20, 10, 0]
>>> xs = [0, 10, 20, 40]
>>> xs[::-1]
[40, 20, 10, 0]

这里将解释扩展片语法。请参见文档。

使用列表。Reverse将列表就地反转:

>>> xs = [0, 10, 20, 40]
>>> xs.reverse()
>>> xs
[40, 20, 10, 0]

使用切片以相反的顺序创建一个新列表:

>>> xs[::-1]
[40, 20, 10, 0]

我发现(与其他一些建议相反)l.reverse()是迄今为止在Python 3和2中反转长列表的最快方法。我很想知道其他人是否可以复制这些时间。

L[::-1]可能更慢,因为它在反转列表之前复制了列表。在reversed(l)所做的迭代器周围添加list()调用必须增加一些开销。当然,如果你想要一个列表或迭代器的副本,那么就使用它们各自的方法,但如果你只想反转列表,那么l.reverse()似乎是最快的方法。

功能

def rev_list1(l):
    return l[::-1]

def rev_list2(l):
    return list(reversed(l))

def rev_list3(l):
    l.reverse()
    return l

List

l = list(range(1000000))

Python 3.5计时

timeit(lambda: rev_list1(l), number=1000)
# 6.48
timeit(lambda: rev_list2(l), number=1000)
# 7.13
timeit(lambda: rev_list3(l), number=1000)
# 0.44

Python 2.7计时

timeit(lambda: rev_list1(l), number=1000)
# 6.76
timeit(lambda: rev_list2(l), number=1000)
# 9.18
timeit(lambda: rev_list3(l), number=1000)
# 0.46

将你的需求转换成Python的最直接的方法是这样的for语句:

for i in xrange(len(array) - 1, -1, -1):
   print i, array[i]

这是相当神秘的,但可能有用。