【问题标题】:How to get the previous element when using a for loop? [duplicate]使用for循环时如何获取前一个元素? [复制]
【发布时间】:2011-04-29 11:47:38
【问题描述】:

可能的重复:
Python - Previous and next values inside a loop
python for loop, how to find next value(object)?

我有一个包含很多元素的列表,我使用for 循环遍历列表。例如:

li = [2, 31, 321, 41, 3423, 4, 234, 24, 32, 42, 3, 24, 31, 123]

for i in li:
    print(i)

但我想获取i 之前的元素。我怎样才能做到这一点?

【问题讨论】:

标签: python list for-loop


【解决方案1】:

使用来自hereitertools 配方的选项:

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

for i, j in pairwise(li):
    print(i, j)

【讨论】:

    【解决方案2】:
    j = None
    for i in li:
        print(j)
        j = i
    

    【讨论】:

    • 为什么这比 zip 和 itertool 解决方案不受欢迎?它更具可读性。
    【解决方案3】:

    使用循环计数器作为索引。 (一定要从 1 开始,这样你才能保持在范围内。)

    for i in range(1, len(li)):
      print(li[i], li[i-1])
    

    【讨论】:

      【解决方案4】:

      只需使用enumerate 跟踪索引并通过索引获取上一项

      li = list(range(10))
      
      for i, item in enumerate(li):
          if i > 0:
              print(item, li[i-1])
      
      print("or...")
      
      for i in range(1, len(li)):
          print li[i], li[i-1]
      

      输出:

      1 0
      2 1
      3 2
      4 3
      5 4
      6 5
      7 6
      8 7
      9 8
      or...
      1 0
      2 1
      3 2
      4 3
      5 4
      6 5
      7 6
      8 7
      9 8
      

      另一种选择是记住最后一项,例如

      last_item = None
      for item in li:
          print(last_item, item)
          last_item = item
      

      【讨论】:

        【解决方案5】:

        你可以使用zip:

        for previous, current in zip(li, li[1:]):
            print(previous, current)
        

        或者,如果您需要做一些更花哨的事情,因为创建列表或获取li 的一部分会效率低下,请使用pairwise recipe from itertools

        import itertools
        
        def pairwise(iterable):
            "s -> (s0,s1), (s1,s2), (s2, s3), ..."
            a, b = itertools.tee(iterable)
            next(b, None)
            return zip(a, b)
        
        for a, b in pairwise(li):
            print(a, b)
        

        【讨论】:

        • +1 表示 itertools 的答案,而不是第一个。如果列表很小,第一个很好,但如果列表很大,创建副本效率低下。
        【解决方案6】:

        通常,您使用enumerate()range() 来遍历元素。这是使用zip()的替代方法

        >>> li = [2, 31, 321, 41, 3423, 4, 234, 24, 32, 42, 3, 24, 31, 123]
        >>> list(zip(li[1:], li))
        [(31, 2), (321, 31), (41, 321), (3423, 41), (4, 3423), (234, 4), (24, 234), (32, 24), (42, 32), (3, 42), (24, 3), (31, 24), (123, 31)]
        

        每个元组的第二个元素是列表的前一个元素。

        【讨论】:

        • 是的,这确实有效,但如果您的列表非常大,您是否真的希望通过创建第二个非常大的列表(使用li[1:])来降低性能?
        • 我已经说过它是另一种选择。当然,如果列表真的很大,那么不要使用这种方法。就这么简单。
        【解决方案7】:
        li = [2,31,321,41,3423,4,234,24,32,42,3,24,,31,123]
        
        counter = 0
        for l in li:
            print l
            print li[counter-1] #Will return last element in list during first iteration as martineau points out.
            counter+=1
        

        【讨论】:

        • 第一次迭代引发异常是错误的。 alist[-1] 是列表的最后一个元素。听起来您并没有尝试自己运行它——不过,不值得投反对票。
        • 谢谢 - 我今天学到了一些东西。 :-)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-01-05
        • 1970-01-01
        • 2019-10-01
        • 1970-01-01
        • 2021-01-22
        • 1970-01-01
        • 2019-12-28
        相关资源
        最近更新 更多