如何比较两个Form对象列表?需识别四类对象差异情况
如何比较两个Form对象列表并识别四类情况?
首先先明确咱们的基础类定义:
class Form: def __init__(self,name, value): self.name = name self.value = value def __eq__(self, other): return self.name == other.name and self.value == other.value
要对比两个Form对象列表、找出你提到的四类情况,我推荐用字典转换+列表推导的方式来实现——这种方法比嵌套遍历高效得多,逻辑也更清晰。
实现思路
核心是先把两个列表转换成以name为键、value为值的字典,这样能快速完成键的存在性检查和值的对比:
- 从第一个列表生成
dict1,第二个列表生成dict2 - 基于两个字典的键集合,分别筛选出四类情况
完整代码示例
class Form: def __init__(self,name, value): self.name = name self.value = value def __eq__(self, other): return self.name == other.name and self.value == other.value def compare_form_lists(list1, list2): # 把列表转成字典,方便快速查找匹配 dict1 = {form.name: form.value for form in list1} dict2 = {form.name: form.value for form in list2} # 1. 名称和值均相等的对象(这里返回名称,如需返回Form对象可看注释) matched = [name for name in dict1 if name in dict2 and dict1[name] == dict2[name]] # 如果需要返回对应Form对象: # matched_forms = [form for form in list1 if form.name in dict2 and form.value == dict2[form.name]] # 2. 名称相同但值不同的对象(返回(名称, list1的值, list2的值)元组) name_same_value_diff = [ (name, dict1[name], dict2[name]) for name in dict1 if name in dict2 and dict1[name] != dict2[name] ] # 3. 仅存在于第一个列表中的名称 only_in_list1 = [name for name in dict1 if name not in dict2] # 4. 仅存在于第二个列表中的名称 only_in_list2 = [name for name in dict2 if name not in dict1] return { "matched": matched, "name_same_value_diff": name_same_value_diff, "only_in_list1": only_in_list1, "only_in_list2": only_in_list2 } # 测试用例 if __name__ == "__main__": list_a = [Form("username", "alice"), Form("email", "alice@test.com"), Form("age", "25")] list_b = [Form("username", "alice"), Form("email", "alice_new@test.com"), Form("address", "123 St")] result = compare_form_lists(list_a, list_b) print("1. 名称和值均相等的对象:", result["matched"]) print("2. 名称相同但值不同的对象:", result["name_same_value_diff"]) print("3. 仅存在于第一个列表中的名称:", result["only_in_list1"]) print("4. 仅存在于第二个列表中的名称:", result["only_in_list2"])
代码说明
- 字典推导式的时间复杂度是O(n),比嵌套循环的O(n*m)高效很多,适合处理较大的列表
- 每一类结果都用列表推导式生成,逻辑直白易懂,也方便根据需求调整返回格式
- 测试用例模拟了所有四类情况,运行后可以直观看到每类的输出结果
内容的提问来源于stack exchange,提问作者Damiano Dotto
相关产品推荐
相关产品推荐

