如何在每次迭代时输出一对反转列表

时间:2016-04-06 01:27:31

标签: python

如何在每次迭代时输出一对反转列表。例如,如果my_list=[11,22,33,44,55],我想在第一次迭代时输出(55,44),在第二次迭代时输出(44,33),依此类推。我想不出除了以下方式之外的任何事情,但它无法正常工作:(

my_list = [11,22,33,44,55]
  for i in reversed(my_list):
     print (i, i+1)

欣赏任何提示。

3 个答案:

答案 0 :(得分:3)

itertools recipes在这里可以提供帮助:

from itertools import tee, izip
def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = tee(iterable)
    next(b, None)
    return izip(a, b)

请注意,在python3.x上,您不需要izip - 您只需使用zip

现在你的循环就是:

for pair in pairwise(reversed(my_list)):
    print(pair)

当然,我们也不需要

a = reversed(my_list)
b = reversed(my_list)
next(b, None)
for pair in zip(a, b):
    print(pair)

这可以让你避免担心python2.x / python3.x兼容性问题(因为它可以在python2.6 +上运行),但是你不会得到很好的可重用(并且更容易阅读)成对功能。

答案 1 :(得分:2)

假设:

>>> my_list=[11,22,33,44,55]

你可以这样做:

>>> zip(my_list[1:], my_list)[::-1]
[(55, 44), (44, 33), (33, 22), (22, 11)]

或者,

>>> reversed(zip(my_list[1:], my_list))

如果你愿意的话。

或者,从评论(如果你想要Python 3和2兼容性):

>>> zip(my_list[::-1], my_list[-2::-1])

答案 2 :(得分:0)

在你的循环中,我是列表中的一个元素而不是索引,因此递增它不是一个好主意。

您可以使用mgilson提供的漂亮的pythonic方式,或者您可以使用简单的C风格循环来实现此目的:

>>> my_list = [11,22,33,44,55]
>>> for i in xrange(len(my_list) - 1):
...    print my_list[len(my_list) - 1 - i], my_list[len(my_list) - 1 - i - 1]
... 
55 44
44 33
33 22
22 11