【问题标题】:Appending errors to an empty list in nested loop将错误附加到嵌套循环中的空列表
【发布时间】:2014-12-08 13:37:28
【问题描述】:

我是嵌套循环的新手,仍在尝试解决问题。我想遍历两个列表,并根据前两个列表上的一些计算将值附加到一个新列表中。最终,我试图根据 value2 列表中的一系列值来修复 value1 列表中的错误。但是,我想确保嵌套循环中的 value2 列表中的参数是否不满足,它在我的循环中被标记。另外,如果我没有说清楚,我深表歉意:

这是我的两个列表:

value1 = [199, 201, 200, 202, 204, 206, 215, 210]
value2 = [200, 203, 206]

这是我的代码:

result = []
for row1 in value1:
    for row2 in value2:
        x = row1 - row2
        if x == 0:
            new_x = row1
        elif x == 1:
            new_x = row1 - 1
        elif x == -1:
            new_x = row1 + 1
        else:
            pass
    result.append(new_x)

现在我确实得到了不错的结果:

print(result)
[200, 200, 200, 203, 203, 206, 206, 206]

但请注意,列表的最后三个数字实际上并未在 value2 中满足。我想用“错误”标记这些。我尝试了以下方法:

value1 = [199, 201, 200, 202, 204, 206, 215, 210]
value2 = [200, 203, 206]

result = []
for row1 in value1:
    for row2 in value2:
        x = row1 - row2
        if x == 0:
            new_x = row1
        elif x == 1:
            new_x = row1 - 1
        elif x == -1:
            new_x = row1 + 1
        elif x > 1:
            new_x = "ERROR"
        elif x < -1:
            new_x = "ERROR"
        else:
            pass
    result.append(new_x)

但我最终得到了这个:

print(result)
['ERROR', 'ERROR', 'ERROR', 'ERROR', 'ERROR', 206, 'ERROR', 'ERROR']

最终,我想要这个:

print(result)
[200, 200, 200, 203, 203, 206, 'ERROR', 'ERROR']

我错过了什么?感谢您的宝贵时间!

【问题讨论】:

  • 我想我明白为什么你想要200, 200, 200, 203, 203 用于前五个,为什么你想要'ERROR', 'ERROR' 用于后两个,但是......为什么'ERROR' 而不是206 用于第六个?
  • 哦,是的,很抱歉我没听清楚。我现在将对其进行编辑。

标签: python list for-loop append nested-loops


【解决方案1】:

您运行您的内部循环 3 次(对于 value2 中的每个值一次,但您不对循环内的 new_x 执行任何操作。只有在完成所有 3 次迭代后,您才尝试将其附加到列表。这意味着您所做的最后一个 new_x = … 将覆盖前两个。因此,换句话说,值与 200 和 203 的接近程度无关紧要,重要的是它们与 206 的接近程度。因为@ 987654324@ 不接近206,它给你ERROR

我不完全确定您要做什么,但我认为您希望将每个 value1 与每个 value2 进行比较,并将结果保留为最接近的 value2,不是最后一个。为此,您实际上需要编写仅更新new_x 的代码,前提是它比以前的版本更接近。

你可以这样做:

if x == 0:
    new_x = row1
elif x == 1:
    if new_x != row1:
        new_x = row1 - 1

... 等等,在每种情况下测试您尚未将其设置为“更好”的东西。但这会变得真的很笨重。

我认为最简单的方法是首先计算所有list2 的最小(绝对)差异,然后才应用它。比如:

diff = None
for row2 in value2:
    x = row1 - row2
    if diff is None or abs(x) < abs(diff):
        diff = x
if abs(diff) <= 1:
    new_x = row1 - diff
else:
    new_x = "ERROR"

所以,这给了你[200, 200, 200, 203, 203, 206, 'ERROR', 'ERROR'],这似乎是你的描述所要求的。


无论如何,一旦你完成了这项工作,你就可以简化这一切。例如,内循环可以写成:

diff = min((row1 - row2 for row2 in value2), key=abs)

其实你可以把整个循环重写为:

diffs = (min((row1 - row2 for row2 in value2), key=abs) for row1 in value1)
result = [row1 - diff if abs(diff) <= -1 else 'ERROR'
          for row1, diff in zip(value1, diffs)]

【讨论】:

  • 感谢您提供此服务。我需要一点时间才能理解,但我非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2022-07-14
  • 2022-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-31
  • 1970-01-01
相关资源
最近更新 更多