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

从含字典与字符串属性的复杂对象列表中移除重复项

解决对象去重问题:移除name和字典完全匹配的重复项

我明白你遇到的问题了——直接用foreach遍历原列表并删除重复项确实容易出问题,要么会触发集合修改的异常,要么会因为遍历过程中列表长度变化导致漏判。下面给你两种常见语言的解决方案,核心思路是用辅助集合记录已出现的唯一标识,同时构建新的无重复列表,而不是直接修改原列表。

核心思路

要判断两个对象是否重复,我们需要一个能唯一代表name+dictionary组合的可哈希标识(因为字典本身是不可哈希的,不能直接放进集合里)。具体来说:

  • 把字典的键值对转换成排序后的固定结构(比如排序后的元组或字符串),这样即使字典键的顺序不同,只要键值对完全一致,得到的标识就相同
  • 用name加上这个标识作为判断重复的依据,存入哈希集合快速查重

示例1:C#实现

假设你的对象类定义如下:

public class MyObject
{
    public string Name { get; set; }
    public Dictionary<string, object> Dictionary { get; set; }
}

去重方法的实现:

public List<MyObject> RemoveDuplicateObjects(List<MyObject> inputObjects)
{
    // 用哈希集合存储已经见过的(name, 字典标识)组合
    var seenCombinations = new HashSet<(string Name, string DictFingerprint)>();
    var uniqueObjects = new List<MyObject>();

    foreach (var obj in inputObjects)
    {
        // 将字典转换为排序后的键值对字符串,消除键顺序的影响
        var dictFingerprint = string.Join("|", 
            obj.Dictionary.OrderBy(kv => kv.Key)
                          .Select(kv => $"{kv.Key}:{kv.Value}"));
        
        var combinationKey = (obj.Name, dictFingerprint);

        // 如果这个组合没出现过,就加入结果列表和记录集合
        if (!seenCombinations.Contains(combinationKey))
        {
            seenCombinations.Add(combinationKey);
            uniqueObjects.Add(obj);
        }
    }

    return uniqueObjects;
}

示例2:Python实现

如果是Python环境,对象类和去重方法可以这样写:

class MyObject:
    def __init__(self, name, dictionary):
        self.name = name
        self.dictionary = dictionary

def remove_duplicate_objects(input_objects):
    seen_combinations = set()
    unique_objects = []

    for obj in input_objects:
        # 将字典转换为排序后的键值对元组,确保可哈希且不受键顺序影响
        dict_fingerprint = tuple(sorted(obj.dictionary.items()))
        combination_key = (obj.name, dict_fingerprint)

        if combination_key not in seen_combinations:
            seen_combinations.add(combination_key)
            unique_objects.append(obj)
    
    return unique_objects

为什么不建议直接用foreach修改原列表?

  • 在C#中,foreach依赖集合的枚举器,遍历过程中修改集合(添加/删除元素)会直接抛出InvalidOperationException
  • 在Python中,遍历列表时删除元素会导致索引偏移,后面的元素会被跳过,最终漏判部分重复项

用新列表+哈希集合的方式,既避免了遍历修改的问题,又能通过哈希集合的O(1)查询效率保证去重的性能。

内容的提问来源于stack exchange,提问作者Christopher

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:16:50