Python:移除字典列表中指定键值重复项,保留首次出现的字典
保留字典列表中每个唯一ID的首个项,移除重复项
问题描述
给定字典列表:
givenValues=[ {'id': '0001', 'name': 'me'}, {'id': '0002', 'name': 'me'}, {'id': '0001', 'name': 'you'}, {'id': '0003', 'name': 'hi'}, {'id': '0001', 'name': 'they'}, {'id': '0002', 'name': 'me'}, {'id': '0002', 'name': 'me'} ]
需要保留每个唯一id对应的首个字典,移除其余重复项,期望结果:
[ {'id': '0001', 'name': 'me'}, {'id': '0002', 'name': 'me'}, {'id': '0003', 'name': 'hi'} ]
现有尝试的问题分析
尝试1的错误
第一种方法中,tempList会重复收集同ID的后续项,而list.remove(item)会删除列表中第一个匹配的项,而非目标的j项。比如删除tempList中的id0002项时,会误删原列表中第一个id0002的条目,导致最终结果丢失该内容。
尝试2的错误
第二种方法在遍历列表时直接修改原列表(删除元素),导致列表长度和索引错位,循环会跳过部分元素,无法彻底删除所有重复项,最终残留未清理的条目。
正确解法
方法1:用集合跟踪已出现的ID(最直观)
遍历原列表,用集合记录已经处理过的ID,只保留首次出现的项:
givenValues = [ {'id': '0001', 'name': 'me'}, {'id': '0002', 'name': 'me'}, {'id': '0001', 'name': 'you'}, {'id': '0003', 'name': 'hi'}, {'id': '0001', 'name': 'they'}, {'id': '0002', 'name': 'me'}, {'id': '0002', 'name': 'me'} ] seen_ids = set() result = [] for item in givenValues: item_id = item['id'] if item_id not in seen_ids: seen_ids.add(item_id) result.append(item) print(result)
方法2:利用字典的唯一性(Python 3.7+)
Python 3.7及以上的字典会保留插入顺序,用字典存储首次出现的ID对应的项:
unique_dict = {} for item in givenValues: # 仅当ID未存在时才添加,确保保留首个项 if item['id'] not in unique_dict: unique_dict[item['id']] = item result = list(unique_dict.values()) print(result)
两种方法都能得到符合预期的结果。
内容的提问来源于stack exchange,提问作者HimDek
相关产品推荐
相关产品推荐

