Python中如何对包含相同id值的字典列表进行去重
Python按id字段对字典列表去重实现方案
通用场景(字典为原生Python对象无需转换)
核心逻辑为记录已经出现过的id值,仅保留id第一次出现的对应字典,实现代码如下:
example = [{'term': 'potato', 'id': 10}, {'term': 'potatoes', 'id': 10}, {'term': 'apple', 'id': 7}] new_list = [] seen_ids = set() for item in example: current_id = item['id'] if current_id not in seen_ids: new_list.append(item) seen_ids.add(current_id)
运行后new_list的值即为期望结果:[{'term': 'potato', 'id': 10}, {'term': 'apple', 'id': 7}]
特殊场景(字典为Solr返回的字符串格式)
你原有代码的逻辑本身是正确的,若运行不符合预期可以添加异常兼容避免非法数据影响,代码如下:
import ast new_list = [] seen_keys = set() for term in example: # 兼容格式非法的字符串项 try: d = ast.literal_eval(term) except (SyntaxError, ValueError): continue # 兼容无id字段的字典 current_id = d.get('id') if current_id is None: continue if current_id not in seen_keys: new_list.append(d) seen_keys.add(current_id)
如果需要保留相同id最后一次出现的字典,可以改用临时字典存储的方式实现:
import ast id_map = {} for term in example: try: d = ast.literal_eval(term) except (SyntaxError, ValueError): continue if d.get('id') is not None: id_map[d['id']] = d # 相同id后面的项会覆盖前面的 new_list = list(id_map.values())
两种实现的时间复杂度均为O(n),处理大量数据时效率足够。
内容的提问来源于stack exchange,提问作者blah
相关产品推荐
相关产品推荐

