【问题标题】:Check if next value is equal o current value in python loop?检查下一个值是否等于python循环中的当前值?
【发布时间】:2015-02-01 00:50:56
【问题描述】:

我正在循环一个文件,我想检查下一个即将到来的对象是否等于当前对象。这两个对象都有一个属性名称,例如 Obj.name

这里是一些简化的例子:

文件包含:

Oba_A
Obj_B
Obj_C
Obj_D

我像这样循环遍历它们:

for obj in open("file.txt"):
    check if Obj_A.name==Obj_B.name, if not:
        if Obj_B.name==Obj_C.name

我是一名学习编程的生物学家。我希望我在这里得到足够的鼓励。

【问题讨论】:

  • 这是文件的内容吗?对象在哪里?这些只是不同的字符串。发布预期的输入和输出可以帮助我们帮助您。
  • 这取决于文件中每一行的实际内容以及检查对象的最终用途。
  • 我正在读取一个文件并创建未在此处显示的对象。
  • 与其检查下一个,不如检查 previous 值。记住已经通过的内容比查看下一个要读取的值要容易得多。

标签: python python-2.7 loops


【解决方案1】:

忽略如何从文本文件中获取对象的问题,您的基本答案可能如下所示:

last_value = None
for obj in collection:
    if obj.name == last_value:
        # do something
    else:
        # do something different
    last_value = obj.name

更新: 如果您想根据与下一个对象的匹配对第一个对象执行,您可以存储对前一个对象的引用而不仅仅是名称,例如:

prev_obj = None
for obj in collection:
    if obj.name == prev_obj.name:
        # do something with prev_obj
    else:
        # do something different
    prev_obj = obj

或者,如果将这些视为“当前”和“下一个”确实有帮助:

cur_obj = None
for next_obj in collection:
    if next_obj.name == cur_obj.name:
        # do something with cur_obj
    else:
        # do something different
    cur_obj = next_obj

但请注意,我所做的只是更改了命名。过程还是一样的。

其他更新: 第一次通过循环时,prev_obj 为 None,因此它不会有 name 属性。通过将其更新为:

prev_obj = None
for obj in collection:
    if prev_obj is not None and obj.name == prev_obj.name:
        # do something with prev_obj
    else:
        # do something different
    prev_obj = obj

【讨论】:

  • 我们可以做类似的事情,但将下一个值与当前值进行比较,而不是将当前值与前一个值进行比较?像我们可以将 last_value 作为初始值并与下一个值进行比较吗?
  • 我已更新答案以作用于前一个对象而不是下一个对象。从逻辑上讲,比较序列中任何两个相邻项目的方式没有区别......但从字面上看,集合中的“向前看”会增加代码复杂性并可能显着降低性能,因为您将访问集合成员两种不同的方式。这并非不可能,但如果您刚刚开始,我鼓励您首先采用“正确”的方式。
【解决方案2】:

跟踪我们看到的最后一个对象并与当前对象进行比较:

objects = ([....])
prev = objects[0]
for obj in objects[1:]:
   if prev.name == obj.name:
       # do whatever
   else:
       # do something else
   prev = obj # update prev to current obj

如果 objects 是某种迭代器或确实是文件对象,请使用prev = next(objects) 开始,然后循环剩余的对象。

顺便说一句,使用with 打开您的文件,因为它会自动关闭它们:

with open("file.txt") as f:
   prev = next(f)
   for obj in f:
       # create objects
       if prev.name == obj.name:
            # do whatever
      else:
           # do something else
      prev = obj

【讨论】:

  • 您对名称 start 的使用令人困惑。为什么不将其命名为 previouspreceding
  • @MartijnPieters,这会测试所有连续的元素
  • @MartijnPieters,好吧,它是起始对象,因此将其称为先前对象也不完全正确。无论哪种方式,代码都可以满足 OP 的要求并有效地完成
  • 只有在第一次迭代之前它是起始对象,之后它是您在循环中处理的前一个或前一个对象。
  • @MartijnPieters,只为你改变
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-17
  • 2021-11-11
  • 2021-07-13
  • 2017-02-19
  • 2014-04-14
  • 2022-01-18
  • 1970-01-01
相关资源
最近更新 更多