如何高效移除含字典与整数的嵌套列表中的重复项?
嵌套列表去重优化方案
问题场景
你有一个嵌套列表,每个子列表包含1个字典和1个整数,其中存在重复项(依据子列表中的字典判断重复)。当前通过循环迭代新列表实现去重,希望用更简洁的写法或更高效的方式优化。
原代码及期望输出:
TRIAL=[[{'http': '46.101.160.223:80', 'https': '46.101.160.223:80'}, 0], [{'http': '66.70.178.214:9300', 'https': '66.70.178.214:9300'}, 0], [{'http': '130.61.100.135:80', 'https': '130.61.100.135:80'}, 0], [{'http': '157.245.27.9:3128', 'https': '157.245.27.9:3128'}, 0], [{'http': '185.246.84.7:8080', 'https': '185.246.84.7:8080'}, 0], [{'http': '185.246.84.7:8080', 'https': '185.246.84.7:8080'}, 0], [{'http': '130.61.100.135:80', 'https': '130.61.100.135:80'}, 1]] # 现有去重逻辑 temporary_list=[] for i in TRIAL: if i[0] not in [item[0] for item in temporary_list]: temporary_list.append(i) # 期望输出 # [[{'http': '46.101.160.223:80', 'https': '46.101.160.223:80'}, 0], # [{'http': '66.70.178.214:9300', 'https': '66.70.178.214:9300'}, 0], # [{'http': '130.61.100.135:80', 'https': '130.61.100.135:80'}, 0], # [{'http': '157.245.27.9:3128', 'https': '157.245.27.9:3128'}, 0], # [{'http': '185.246.84.7:8080', 'https': '185.246.84.7:8080'}, 0]]
优化方案
1. 高性能去重(时间复杂度O(n))
原代码每次判断都要生成新列表,时间复杂度为O(n²),数据量大时效率极低。可以将字典转换为可哈希的元组,用集合记录已出现的特征,将判断操作优化为O(1):
seen = set() result = [] for d, num in TRIAL: # 把字典键值对排序后转成元组,确保内容相同的字典生成一致的哈希键 key = tuple(sorted(d.items())) if key not in seen: seen.add(key) result.append([d, num])
2. 一行式实现(基于字典特性)
利用字典键的唯一性,可以实现一行代码去重。注意:默认会保留重复项中最后出现的子列表,若需保留第一个出现的,需反转列表后处理:
# 保留最后一个出现的重复项 result = list({tuple(sorted(item[0].items())): item for item in TRIAL}.values()) # 保留第一个出现的重复项 result = list({tuple(sorted(item[0].items())): item for item in reversed(TRIAL)}.values())[::-1]
3. 关于列表推导式的说明
纯列表推导式是无状态的,无法在推导过程中记录已出现的元素,因此没法直接用纯列表推导式实现高效去重。上面的一行式本质是利用字典的特性,而非纯列表推导。
关键注意点
- 转换字典为元组时必须排序:Python3.7+字典有序,但低版本无序,排序能保证内容相同的字典生成一致的哈希键,避免误判。
内容的提问来源于stack exchange,提问作者Rivered
相关产品推荐
相关产品推荐

