You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

检查字典列表值是否存在并追加对应值时的变量作用域问题

列表字典值存在性检查及地址分类问题解决

我需要把两个字典列表里的元素按name是否存在来分类:存在的把address放进exists_list,不存在的放进not_exists_list。但写的代码因为变量作用域的问题报错,拿不到匹配的字典值。

错误代码

list_dict = [ { 'name': 'Lucas', 'addr': 4 }, { 'name': 'Gregor', 'addr': 44 }]
list_dict_comp = [ 
    { 'name': 'Lucas', 'address': 'Lucas_XXASD' }, 
    { 'name': 'Gregor', 'address': 'Gregor_ASDXX' }, 
    { 'name': 'Iz', 'address': 'IZ_KOS' } 
]

exists_list = []
not_exists_list = []

for i in list_dict:
  if not any(a['name'] == i['name'] for a in list_dict_comp):
    not_exists_list.append(a['address'])   # <--- 这里报错,'a'没定义
  else:
    exists_list.append(a['address'])

报错信息

Traceback (most recent call last):
  File "python3.py", line 11, in <module>
    exists_list.append(a['address'])
NameError: name 'a' is not defined

期望输出

not_exists_list = ['IZ_KOS']
exists_list = ['Lucas_XXASD', 'Gregor_ASDXX']

问题出在哪

  1. 变量作用域限制:any()函数里的a是生成器内部的局部变量,出了any()的范围就访问不到,导致报错。
  2. 遍历逻辑错误:原代码遍历list_dict,但实际需要分类的是list_dict_comp里的元素,遍历对象搞反了。

正确写法

高效版:先存名字集合再判断

先把list_dict里的name提取成集合(查询速度更快),再遍历list_dict_comp完成分类:

list_dict = [ { 'name': 'Lucas', 'addr': 4 }, { 'name': 'Gregor', 'addr': 44 }]
list_dict_comp = [ 
    { 'name': 'Lucas', 'address': 'Lucas_XXASD' }, 
    { 'name': 'Gregor', 'address': 'Gregor_ASDXX' }, 
    { 'name': 'Iz', 'address': 'IZ_KOS' } 
]

# 把存在的名字存成集合,查询时间复杂度O(1)
existing_names = {item['name'] for item in list_dict}

exists_list = []
not_exists_list = []

for comp_item in list_dict_comp:
    if comp_item['name'] in existing_names:
        exists_list.append(comp_item['address'])
    else:
        not_exists_list.append(comp_item['address'])

print(f"not_exists_list = {not_exists_list}")
print(f"exists_list = {exists_list}")

基础版:逐个匹配查找

如果需要保留遍历list_dict的逻辑,可以先逐个找到匹配项,再单独收集不存在的元素:

list_dict = [ { 'name': 'Lucas', 'addr': 4 }, { 'name': 'Gregor', 'addr': 44 }]
list_dict_comp = [ 
    { 'name': 'Lucas', 'address': 'Lucas_XXASD' }, 
    { 'name': 'Gregor', 'address': 'Gregor_ASDXX' }, 
    { 'name': 'Iz', 'address': 'IZ_KOS' } 
]

exists_list = []
not_exists_list = []

# 收集存在的地址
for item in list_dict:
    for comp_item in list_dict_comp:
        if comp_item['name'] == item['name']:
            exists_list.append(comp_item['address'])
            break

# 收集不存在的地址
existing_names = {item['name'] for item in list_dict}
for comp_item in list_dict_comp:
    if comp_item['name'] not in existing_names:
        not_exists_list.append(comp_item['address'])

print(f"not_exists_list = {not_exists_list}")
print(f"exists_list = {exists_list}")

运行结果

not_exists_list = ['IZ_KOS']
exists_list = ['Lucas_XXASD', 'Gregor_ASDXX']

内容的提问来源于stack exchange,提问作者N. J

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 00:25:19