在Python中循环遍历列表中的一对值(循环方式)

37

问题很简单,我想要遍历列表中的每个元素和它后面的元素(将最后一个元素与第一个元素组成一对)。

我想到了两种非Pythonic的方法:

def pairs(lst):
    n = len(lst)
    for i in range(n):
        yield lst[i],lst[(i+1)%n]

并且:

def pairs(lst):
    return zip(lst,lst[1:]+lst[:1])

期望输出:

>>> for i in pairs(range(10)):
    print i

(0, 1)
(1, 2)
(2, 3)
(3, 4)
(4, 5)
(5, 6)
(6, 7)
(7, 8)
(8, 9)
(9, 0)
>>> 

您有没有更 Pythonic 的方式来做这件事?也许有一些我没听说过的预定义函数可以使用?

另外,一个更一般的 n-fold 版本(三元组、四元组等而不是对)可能也很有趣。


1
你的第一个解决方案已经足够好了! - Xolve
3
在第二个版本中,将lst[0]更改为lst[:1]以使其适用于空序列。代码变得更加对称。 - Darius Bacon
1
在第二个版本中,+[lst[:1]] 应该被替换为 +lst[:1],是吗? - Manuel Selva
@ManuelSelva 您是正确的,当我写下这个代码时它是 [lst[0]],但我不知道为什么 @colonelpanic 把它改了。 - fortran
13个回答

0
def pairs(ex_list):
    for i, v in enumerate(ex_list):
        if i < len(list) - 1:
            print v, ex_list[i+1]
        else:
            print v, ex_list[0]

枚举函数返回一个包含索引号和值的元组。我打印出值以及列表中的下一个元素 ex_list[i+1]。如果 i < len(list) - 1 则表示 v 不是列表的最后一个成员。如果是最后一个成员,则打印 v 和列表的第一个元素 print v, ex_list[0]

编辑:

你可以让它返回一个列表。只需将打印的元组追加到一个列表中并返回即可。

def pairs(ex_list):
    result = []
    for i, v in enumerate(ex_list):
        if i < len(list) - 1:
            result.append((v, ex_list[i+1]))
        else:
            result.append((v, ex_list[0]))
    return result

你能解释一下你的答案吗? - Stephan

0
当然,您始终可以使用一个 deque
from collections import deque
from itertools import *

def pairs(lst, n=2):
    itlst = iter(lst)
    start = list(islice(itlst, 0, n-1))
    deq = deque(start, n)
    for elt in chain(itlst, start):
        deq.append(elt)
        yield list(deq)

-1
i=(range(10))

for x in len(i):
    print i[:2]
    i=i[1:]+[i[1]]

比这更具有 Python 风格是不可能的。


比这更不符合 Python 风格实际上非常困难。 - Jean-François Fabre
如果它实际上能够“运行”,那就好了:TypeError: 'int' object is not iterable - Baldrickk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接