也访问上一个和下一个值的循环

新手上路,请多包涵

如何遍历对象列表,访问上一个、当前和下一个项目?像这个 C/C++ 代码,在 Python 中?

 foo = somevalue;
previous = next = 0;

for (i=1; i<objects.length(); i++) {
    if (objects[i]==foo) {
        previous = objects[i-1];
        next = objects[i+1];
    }
}

原文由 dir01 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 244
2 个回答

这应该可以解决问题。

 foo = somevalue
previous = next_ = None
l = len(objects)
for index, obj in enumerate(objects):
    if obj == foo:
        if index > 0:
            previous = objects[index - 1]
        if index < (l - 1):
            next_ = objects[index + 1]

这是关于 enumerate 函数的文档。

原文由 Hank Gay 发布,翻译遵循 CC BY-SA 3.0 许可协议

到目前为止的解决方案只处理列表,而且大多数都是复制列表。以我的经验,很多时候这是不可能的。

此外,它们不处理列表中可以有重复元素的事实。

你的问题的标题是“ _循环内的上一个和下一个值_”,但如果你在循环内运行大多数答案,你最终将在每个元素上再次遍历整个列表以找到它。

所以我刚刚创建了一个函数。使用 itertools 模块,对可迭代对象进行拆分和切片,并生成包含前后元素的元组。不完全是您的代码的作用,但值得一看,因为它可能可以解决您的问题。

 from itertools import tee, islice, chain, izip

def previous_and_next(some_iterable):
    prevs, items, nexts = tee(some_iterable, 3)
    prevs = chain([None], prevs)
    nexts = chain(islice(nexts, 1, None), [None])
    return izip(prevs, items, nexts)

然后在循环中使用它,您将在其中包含上一个和下一个项目:

 mylist = ['banana', 'orange', 'apple', 'kiwi', 'tomato']

for previous, item, nxt in previous_and_next(mylist):
    print "Item is now", item, "next is", nxt, "previous is", previous

结果:

 Item is now banana next is orange previous is None
Item is now orange next is apple previous is banana
Item is now apple next is kiwi previous is orange
Item is now kiwi next is tomato previous is apple
Item is now tomato next is None previous is kiwi

它适用于任何大小的列表(因为它不复制列表),以及任何可迭代对象(文件、集合等)。这样您就可以遍历序列,并在循环内使用上一个和下一个项目。无需再次搜索序列中的项目。

代码的简短解释:

  • tee 用于在输入序列上高效地创建 3 个独立的迭代器
  • chain 将两个序列合二为一;它在这里用于将单元素序列 [None] 附加到 prevs
  • islice 用于生成除第一个元素之外的所有元素的序列,然后 chain 用于将 None 添加到其末尾
  • 现在有 3 个独立的序列基于 some_iterable 看起来像:
    • prevs : None, A, B, C, D, E
    • items : A, B, C, D, E
    • nexts : B, C, D, E, None
  • 最后 izip 用于将 3 个序列更改为一个三元组序列。

请注意 izip 在任何输入序列耗尽时停止,因此 prevs 的最后一个元素将被忽略,这是正确的 - 没有这样的元素,最后一个元素将是它的 prev 。我们可以尝试 prevs 的最后一个元素,但是 izip 的行为使它变得多余

Also note that tee , izip , islice and chain come from the itertools module;他们在运行中(懒惰地)对他们的输入序列进行操作,这使它们变得高效并且不需要在任何时候立即将整个序列存储在内存中。

在 Python 3 中,导入 izip 时会显示错误。您可以使用 zip 代替 izip 。无需导入 zip ,它已在 Python 3 中预定义( )。

原文由 nosklo 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题