代码之家  ›  专栏  ›  技术社区  ›  bluegray

在迭代过程中读取python列表中的其他项[重复]

  •  1
  • bluegray  · 技术社区  · 14 年前

    可能重复:
    Python: Looping through all but the last item of a list

    当您还需要列表中的下一个项(或任何其他任意项)时,是否有更好的迭代列表的方法?我用这个,但也许有人能做得更好…

    values = [1, 3, 6, 7 ,9]
    diffs = []
    for i in range(len(values)):
        try: diffs.append(values[i+1] - values[i])
        except: pass
    
    print diffs
    

    给予:

    [2, 3, 1, 2]
    
    6 回复  |  直到 14 年前
        1
  •  1
  •   Tim Pietzcker    14 年前

    你可以使用

    for pos, item in enumerate(values):
        try:
            diffs.append(values[pos+1] - item)
        except IndexError:
            pass
    

    尽管在您的案例中(因为您只是在寻找下一个值),您也可以简单地使用

    for item,nextitem in zip(values, values[1:]):
        diffs.append(nextitem-item)
    

    也可以表示为列表理解:

    diffs = [nextitem-item for item,nextitem in zip(values, values[1:])]
    
        2
  •  4
  •   Katriel    14 年前
    >>> values = range(10)
    >>> values
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> zip(values[0:],values[1:])
    [(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9)]
    
        3
  •  2
  •   sunqiang    14 年前

    在……的帮助下呢? pairwise recipe from itertools document

    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)
    def main():
        values = [1, 3, 6, 7 ,9]
        diffs = [post - prior for prior, post in pairwise(values)]
        print diffs
    
    
    if __name__ == "__main__":
        main()
    

    输出
    〔2, 3, 1,2〕

        4
  •  1
  •   SilentGhost    14 年前
    for i, j in zip(values, values[1:]):
         j - i
    
        5
  •  1
  •   Sven Marnach    14 年前
    diff = [values[i+1] - values[i] for i in range(len(values)-1)]
    
        6
  •  0
  •   ceth    14 年前
    [y - x for x,y in zip(L,L[1:])]