Python:移除字典中首个元素不同但其余元素重复的嵌套列表
解决Python字典中嵌套列表的特定去重需求
嘿,你的这个解法真的相当巧妙!刚好精准命中了「移除嵌套列表中首个元素不同但其余元素重复项」的需求,我来帮你拆解下这段代码的逻辑,再补充点实用细节:
你的核心代码解析
你写的这段字典推导式完美解决了问题:
nduplicates = {k:[list(y) for y in {tuple(x[1:]) for x in v}] for k,v in results.items()}
拆解来看每一步的作用:
- 最内层的
{tuple(x[1:]) for x in v}:因为列表是不可哈希类型,没法直接放进集合去重,所以把每个嵌套列表从第二个元素开始的部分转成元组,利用集合的自动去重特性,精准过滤掉「后几位元素重复」的项 - 接着
[list(y) for y in ...]:把去重后的元组转回列表,保持原数据的格式一致性 - 最外层的字典推导式:遍历原字典的每一组键值对,把处理后的嵌套列表重新映射到对应的键上
针对你的示例数据验证
拿你给出的results示例测试:
results = { 'example': [ ['london','5.123', '-3.123'], ['bham','5.123', '-3.123'], ['manc','51.23', '-3.453'] ] }
运行代码后,nduplicates['example']会变成包含两个元素的列表——后两位为'5.123', '-3.123'的重复项被成功移除。不过要注意:集合是无序的,最终保留的是london还是bham开头的项是随机的,如果需要保留原始列表中首次出现的项,可以用下面的补充方案:
补充:保留首次出现的去重方案
如果需要确保留下每个重复组里第一个出现的嵌套列表(比如想保留['london','5.123', '-3.123']而非bham开头的),可以改用字典记录已出现的项,可读性也更强:
nduplicates = {} for k, v in results.items(): seen = {} unique_list = [] for item in v: # 用后几位转成的元组作为去重标识 key = tuple(item[1:]) if key not in seen: seen[key] = True unique_list.append(item) nduplicates[k] = unique_list
这个版本会严格按照原始列表的顺序,保留每个重复组合的第一个出现项。
内容的提问来源于stack exchange,提问作者Oj Aprel
相关产品推荐
相关产品推荐

