检查字典列表值是否存在并追加对应值时的变量作用域问题
列表字典值存在性检查及地址分类问题解决
我需要把两个字典列表里的元素按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']
问题出在哪
- 变量作用域限制:
any()函数里的a是生成器内部的局部变量,出了any()的范围就访问不到,导致报错。 - 遍历逻辑错误:原代码遍历
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
相关产品推荐
相关产品推荐

