1

可能重复:
Python:遍历列表中除最后一项之外的所有项

假设我想遍历一个列表。每次我迭代时,我都想使用当前项和下一项来计算一些东西。我可以做类似的事情

mylist = [1, 2, 3, 4]
for i in range(len(mylist)):
    try:
        compute(mylist[i], mylist[i+1])
    except IndexError:
        compute(mylist[i])

我也可以

mylist = [1, 2, 3, 4]
for num in mylist:
    try:
        compute(num, mylist[mylist.index(num)+1])
    except IndexError:
        compute(num)

这些似乎都不是特别好。有没有更蟒蛇的方法来做到这一点?

4

4 回答 4

1

有三种方法可以做到这一点(尽管我可能更喜欢第一种,除非您的条件不同):

  1. 使用itertools.izip()- 这将是高效和 Pythonic:

    for item1, item2 in itertools.izip(my_list, my_list[1:]):
        # do something...
    
  2. 使用enumerate()

    for index, item in enumerate(my_list):
        # do something...
    
  3. 将前一行存储在一个变量中(该示例假设None您的列表中没有):

    previous = None
    for item in my_list:
        if previous is None:
            previous = item
            continue
        # do something...
    
于 2012-11-27T00:36:13.960 回答
1

您可以使用内置功能enumerate

mylist = [1, 2, 3, 4]
for i, num in enumerate(mylist):
    try:
        compute(num, mylist[i+1])
    except IndexError:
        compute(num)

但是在你的两个实现之间进行选择是相当容易的——第二个不仅慢得多(O(n^2)),而且对于重复元素也有奇怪的语义。

于 2012-11-27T00:31:35.410 回答
0

不使用 itertools 的函数式样式可能类似于:

for t in zip(mylist, mylist[1:]):
    compute(*t)

如果性能很重要,您可以使用itertools.izip防止在 zip 期间创建中间列表。

要涵盖问题中所示的特殊情况,请使用:

for t in zip(mylist, mylist[1:]) + [(mylist[-1],)]
    compute(*t)
于 2012-11-27T00:27:30.460 回答
0

最后要涵盖您的特殊情况,您需要:

for t in zip(mylist, mylist[1:]) + [(mylist[-1],)]
    compute(*t)
于 2012-11-27T00:35:42.483 回答