试图弄清楚为什么这个循环打印错误的列表项

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 的修改将不一样。