【问题标题】:Read other items in a python list while iterating through it [duplicate]在遍历它时读取python列表中的其他项目[重复]
【发布时间】:2011-05-03 00:46:21
【问题描述】:

可能重复:
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]

【问题讨论】:

标签: python list iterator


【解决方案1】:

你可以使用

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:])]

【讨论】:

  • 删除了我之前的评论。如果列表长于大约 100 个元素,那么这确实比if 便宜。所以这不是“非常大”,因为我之前声称这是提高效率所必需的。很抱歉造成混乱。
【解决方案2】:
>>> 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)]

【讨论】:

  • itertools.islice当然是为了获得足够大的列表。
  • 虽然这在这种情况下有效,但获取项目索引和项目的方法是使用“枚举”生成器 - 检查@Tim Pietzcker 的答案
  • @jsbueno -- 正确但无关紧要,重点是配对列表中的项目,而不是获取可迭代对象的索引。 @aaron:确实!
【解决方案3】:
for i, j in zip(values, values[1:]):
     j - i

【讨论】:

  • 对于大列表和 Python 2.x,itertools.izip 可能更有效。
【解决方案4】:
diff = [values[i+1] - values[i] for i in range(len(values)-1)]

【讨论】:

    【解决方案5】:

    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]

    【讨论】:

      【解决方案6】:
      [y - x for x,y in zip(L,L[1:])]
      

      【讨论】:

      • 你还没有看到以前的答案,是吗?
      猜你喜欢
      • 2020-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-07
      • 2011-04-26
      • 1970-01-01
      相关资源
      最近更新 更多