Python中对比两列表并更新属性,有无非循环实现方式(类C# Linq)
解决方案
虽然Python没有C# Linq那样的原生语法糖,但可以通过字典映射+列表推导式实现类似的简洁写法,不用显式编写for循环结构(底层仍会有循环,但写法更接近Linq的声明式风格),同时还能提升匹配效率:
步骤1:将list2转为name为键的字典
先把list2转换成以name为键、value为值的字典,这样后续匹配查找的时间复杂度是O(1),远高于双重列表遍历的O(n²):
value_map = {item["name"]: item["value"] for item in list2}
方式一:生成新的更新后列表(类似Linq的Select)
这种方式不修改原list1,返回一个全新的列表,符合函数式编程风格:
updated_list1 = [ {**item, "value": value_map.get(item["name"], item["value"])} for item in list1 ]
这里用字典解包**item复制原字典的所有键值对,再覆盖value字段;get方法保证如果name在list2中不存在,会保留原list1的value值。
方式二:原地更新原list1的元素
如果需要直接修改原list1的对象,可以用map配合lambda实现(无需显式for循环):
# 执行更新操作,map返回的迭代器需要触发执行 list(map(lambda x: x.update({"value": value_map.get(x["name"], x["value"])}), list1))
不过这种方式的可读性稍差,一般更推荐第一种生成新列表的写法。
内容的提问来源于stack exchange,提问作者CrazyCoder
相关产品推荐
相关产品推荐

