试图弄清楚为什么这个循环打印错误的列表项
Trying to figure out why this loop prints the wrong list item
通过这些循环,我正在比较 dictList1 中的值是否在 dictList2 中的值范围内。如果是,那么我从 dictList2 中获取“示例”值并将其放入 dictList1 中。但是,在我最后的 if 语句中,我试图处理一个场景,其中 dictList1 的值不在 dictList2 中,然后打印出该值等,但实际情况是它最终打印列表中的项目 在 包含不在 dictList2 中的值的项目 - 也就是在 dictList1 中打印错误的项目。我不知道为什么
dictList1 = [
{
"name" : "item0",
"num" : 40,
},
{
"name" : "item1",
"num" : 20,
},
]
dictList2 = [{'range':range(1,10),'sample':10},{'range':range(11,25),'sample':20},{'range':range(21,30),'sample':30}]
def func():
for item in dictList1:
for item2 in dictList2:
if item['num'] in item2['range']:
item['sample'] = item2['sample']
if item['num'] not in item2['range']:
print(str(item['num']) + " is not in a range.")
print(dictList1)
func()
for item in dictList1:
item['num'] = otherFunc(item['query'])
# ... other code
当该循环结束时,item
最终成为 dictList1
中的最终值。因此,所有对 item
的后续引用都将使用该最终值。
也许您打算缩进此循环下方的其他代码?
如果我理解正确,您希望代码中的最终 if
打印出第一个字典列表中不与中的任何范围匹配的任何 num
值第二个词典列表。您当前的代码没有这样做,因为当它运行时,它只检查每个列表中的最后一个值(即使 num
在其他地方匹配)。
这是我认为你想要的:
for item in dictList1:
unmatched = True
for item2 in dictList2:
if item['num'] in item2['range']:
item['sample'] = item2['sample']
unmatched = False
if unmatched:
print(str(item['num']) + " is not in a range.")
print(dictList1)
此代码使用布尔标志变量 unmatched
来告诉最后的 if
是否在内循环中找到匹配项。如果您只想找到一个匹配项(例如,因为 dictList2
中的 range
从未重叠),您可以使用稍微简单一些的代码,使用 break
和附加到的 else
子句循环,像这样:
for item in dictList1:
for item2 in dictList2:
if item['num'] in item2['range']:
item['sample'] = item2['sample']
break
else:
print(str(item['num']) + " is not in a range.")
print(dictList1)
虽然这可能不会执行您想要的操作,因为您有重叠的范围,并且它会在找到第一个匹配项后停止内部循环。打印逻辑没问题,但是 in-place 对 dictList1
的修改将不一样。
通过这些循环,我正在比较 dictList1 中的值是否在 dictList2 中的值范围内。如果是,那么我从 dictList2 中获取“示例”值并将其放入 dictList1 中。但是,在我最后的 if 语句中,我试图处理一个场景,其中 dictList1 的值不在 dictList2 中,然后打印出该值等,但实际情况是它最终打印列表中的项目 在 包含不在 dictList2 中的值的项目 - 也就是在 dictList1 中打印错误的项目。我不知道为什么
dictList1 = [
{
"name" : "item0",
"num" : 40,
},
{
"name" : "item1",
"num" : 20,
},
]
dictList2 = [{'range':range(1,10),'sample':10},{'range':range(11,25),'sample':20},{'range':range(21,30),'sample':30}]
def func():
for item in dictList1:
for item2 in dictList2:
if item['num'] in item2['range']:
item['sample'] = item2['sample']
if item['num'] not in item2['range']:
print(str(item['num']) + " is not in a range.")
print(dictList1)
func()
for item in dictList1:
item['num'] = otherFunc(item['query'])
# ... other code
当该循环结束时,item
最终成为 dictList1
中的最终值。因此,所有对 item
的后续引用都将使用该最终值。
也许您打算缩进此循环下方的其他代码?
如果我理解正确,您希望代码中的最终 if
打印出第一个字典列表中不与中的任何范围匹配的任何 num
值第二个词典列表。您当前的代码没有这样做,因为当它运行时,它只检查每个列表中的最后一个值(即使 num
在其他地方匹配)。
这是我认为你想要的:
for item in dictList1:
unmatched = True
for item2 in dictList2:
if item['num'] in item2['range']:
item['sample'] = item2['sample']
unmatched = False
if unmatched:
print(str(item['num']) + " is not in a range.")
print(dictList1)
此代码使用布尔标志变量 unmatched
来告诉最后的 if
是否在内循环中找到匹配项。如果您只想找到一个匹配项(例如,因为 dictList2
中的 range
从未重叠),您可以使用稍微简单一些的代码,使用 break
和附加到的 else
子句循环,像这样:
for item in dictList1:
for item2 in dictList2:
if item['num'] in item2['range']:
item['sample'] = item2['sample']
break
else:
print(str(item['num']) + " is not in a range.")
print(dictList1)
虽然这可能不会执行您想要的操作,因为您有重叠的范围,并且它会在找到第一个匹配项后停止内部循环。打印逻辑没问题,但是 in-place 对 dictList1
的修改将不一样。