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

如何比较两个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为值的字典,这样能快速完成键的存在性检查和值的对比:

  1. 从第一个列表生成dict1,第二个列表生成dict2
  2. 基于两个字典的键集合,分别筛选出四类情况

完整代码示例

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 16:42:55