如何使用setdefault()在创建嵌套字典时去除内部列表重复元素并保持顺序
解决方案:构建嵌套字典时直接实现列表去重并保持顺序
嘿,我完全懂你的需求——不想先把所有重复元素塞进字典再用额外的dict2去二次处理,而是要在构建dict1的过程中就直接让内层列表既无重复又保留原始顺序。结合你用的是Jython(基于Python 2.7),咱们可以直接在填充列表的环节做判断,一步到位。
基础实现方案(适合中小数据集)
核心思路就是在添加元素前,先检查它是否已经在目标列表里,只有不存在时才追加:
from collections import defaultdict dict1 = defaultdict(dict) for i in dataset1: outer_key = i[0] for j in dataset2: inner_key = j[0] val = round(j[1], 2) # 获取对应列表,不存在则初始化为空列表 target_list = dict1[outer_key].setdefault(inner_key, []) # 仅当值未出现过时才添加,保证顺序且去重 if val not in target_list: target_list.append(val)
这样运行完之后,dict1直接就是你想要的结果:内层列表既没有重复值,又严格保持了元素第一次出现的顺序,完全不需要后续的字典推导式处理。
优化方案(适合大数据集)
如果你的dataset1和dataset2数据量很大,上面的方法里val not in target_list是线性查找,效率会有点低。这时候可以额外维护一个嵌套的set来记录已添加的值,把查找的时间复杂度降到O(1):
from collections import defaultdict dict1 = defaultdict(dict) # 辅助结构:记录每个(外层键, 内层键)对应的已添加值集合 seen_values = defaultdict(lambda: defaultdict(set)) for i in dataset1: outer_key = i[0] for j in dataset2: inner_key = j[0] val = round(j[1], 2) # 用辅助set快速判断值是否已存在 if val not in seen_values[outer_key][inner_key]: dict1[outer_key].setdefault(inner_key, []).append(val) seen_values[outer_key][inner_key].add(val)
这个方法牺牲了一点点内存来换速度,对于大数据量的场景会更高效。
两种方案都能帮你在构建dict1的同时完成去重保序的目标,不用再依赖额外的字典做后续处理啦。
内容的提问来源于stack exchange,提问作者Musclemania05
相关产品推荐
相关产品推荐

