如何从Python字典列表中移除值无序匹配的重复字典
字典列表按slice值无序去重实现方法
核心思路
因为业务判定不关心slice前缀键的取值顺序,我们可以将每个字典的所有slice对应值排序后生成唯一可哈希的指纹,通过指纹判断是否重复,仅保留首次出现的字典。
实现代码
original_list = [ {'slice1': 'apple', 'slice2': 'grape', 'slice3': 'banana'}, {'slice1': 'apple', 'slice2': 'apple', 'slice3': 'grape'}, {'slice1': 'apple', 'slice2': 'grape', 'slice3': 'apple'}, {'slice1': 'apple', 'slice2': 'apple', 'slice3': 'apple'}, {'slice1': 'banana', 'slice2': 'grape', 'slice3': 'apple'}, {'slice1': 'banana', 'slice2': 'banana', 'slice3': 'grape'}, {'slice1': 'banana', 'slice2': 'banana', 'slice3': 'banana'}, {'slice1': 'grape', 'slice2': 'grape', 'slice3': 'apple'}, {'slice1': 'grape', 'slice2': 'apple', 'slice3': 'grape'}, {'slice1': 'grape','slice2': 'grape', 'slice3': 'grape'} ] seen_fingerprints = set() dedup_result = [] for item in original_list: # 提取所有slice前缀键的取值,排序后生成唯一指纹 slice_values = [value for key, value in item.items() if key.startswith("slice")] current_fingerprint = tuple(sorted(slice_values)) if current_fingerprint not in seen_fingerprints: seen_fingerprints.add(current_fingerprint) dedup_result.append(item) # 输出去重后的结果 print(dedup_result)
说明
- 该方法兼容任意数量的slice前缀键,后续新增
slice4、slice5等字段无需修改逻辑 - 去重后保留原列表中首次出现的字典,顺序和原列表一致
- 时间复杂度为O(n*m log m),其中n为字典列表长度,m为每个字典的slice键数量,大部分业务场景下性能足够
内容的提问来源于stack exchange,提问作者J. Smith
相关产品推荐
相关产品推荐

