将错误附加到嵌套循环中的空列表中

时间:2014-10-13 21:40:02

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

我是嵌套循环的新手,仍在努力解决问题。我想运行两个列表,并根据前两个列表中的一些计算将值附加到新列表。最后,我试图根据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]

但请注意,值2中实际上并未满足列表的最后三个数字。我想将这些标记为“ERROR”。我尝试过以下方法:

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']

我错过了什么?谢谢你的时间!

1 个答案:

答案 0 :(得分:1)

你运行你的内循环3次(value2中的每个值一次,但是你没有对循环内的new_x做任何事情。只有在完成所有3次迭代后你才会尝试将它附加到列表中。这意味着你所做的最后一个new_x = …将覆盖前两个。换句话说,值与200和203的接近程度无关紧要因为199不接近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)]