Python 如何对字典各键对应的列表值做跨列表比较以提取独有元素
原代码的核心问题
- 未做元素级的筛选判断:仅判断了两个键对应的整列表是否不相等,就直接把整份列表值存入结果,全程没有校验“当前元素是否在其他列表中存在”
- 出现嵌套结果的原因:执行
list_test.append(v1)时,v1本身是列表,把列表作为元素append进空列表,自然形成[['xxx']]的嵌套结构 - 循环覆盖bug:每次遍历到不同的对比键时,都会新建空的
list_test给当前键赋值,之前的计算结果会被直接覆盖,无法累计收集独有元素
正确实现方式
要得到每个列表的独有元素,核心逻辑是:对当前键对应的列表,把除当前键外所有其他列表的元素汇总成公共集合,筛掉当前列表里和这个集合重复的元素,剩余内容就是符合要求的独有值。
用集合做存在性判断逻辑更简单,对应可运行代码:
dict_test = {'hello': ['a', 'b', 'c', 'k', 'g', 'x'], 'bye': ['g', 'a', 'c', 'j'], 'aloa': ['b', 'h', 'a', 'k']} dict_result = {} for current_key, current_list in dict_test.items(): # 汇总所有其他列表的元素 other_elements = set() for other_key, other_list in dict_test.items(): if other_key == current_key: continue other_elements.update(other_list) # 筛选当前列表中不在其他元素集合里的内容 unique_items = [item for item in current_list if item not in other_elements] dict_result[current_key] = unique_items
运行后输出和预期完全一致:
{'hello': ['x'], 'bye': ['j'], 'aloa': ['h']}
如果不需要保留原列表的元素顺序、也不介意对列表内的重复元素去重,还可以用集合差集简化代码:
dict_result = { k: list(set(v) - set().union(*[set(v2) for k2, v2 in dict_test.items() if k2 != k])) for k, v in dict_test.items() }
内容的提问来源于stack exchange,提问作者jeje
相关产品推荐
相关产品推荐

