我是嵌套循环的新手,仍在努力解决问题。我想运行两个列表,并根据前两个列表中的一些计算将值附加到新列表。最后,我试图根据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']
我错过了什么?谢谢你的时间!
答案 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)]