处理字典值中嵌套列表展平与去重时遇TypeError问题求助
问题分析
你遇到的TypeError: unhashable type: 'dict',本质是展平后的列表中存在不可哈希元素(比如字典),而set()要求元素必须是可哈希类型(如字符串、数字、元组等),因此无法直接用set去重。
解决方案
1. 所有元素均为可哈希类型(匹配你的示例场景)
如果嵌套列表里只有字符串、数字这类可哈希元素,推荐用dict.fromkeys()去重——既能去重,又能保留元素首次出现的顺序,更贴合你的期望结果:
完整代码
from itertools import chain my_dict = {'a': [['a','b','c'], ['a',1,4]], 'b':[[1,2,3], [1],[8,2,2,1]]} merged_list = [] for key, nested_lists in my_dict.items(): # 展平嵌套列表:将多层列表转为一维 flattened = list(chain.from_iterable(nested_lists)) # 去重并保留顺序:dict.fromkeys自动忽略重复键,最后转成列表 unique_elements = list(dict.fromkeys(flattened)) # 生成目标字典并加入结果列表 merged_list.append({key: unique_elements}) print(merged_list)
输出结果
[{'a': ['a', 'b', 'c', 1, 4]}, {'b': [1, 2, 3, 8]}]
如果不关心元素顺序,你的原代码在确保导入chain且元素可哈希的情况下也能运行:
from itertools import chain merged_dicts_list = [{k: list(set(chain.from_iterable(v)))} for k, v in my_dict.items()]
2. 存在不可哈希元素(比如嵌套字典)
如果实际数据里包含字典这类不可哈希元素,需要自定义深比较逻辑去重:
完整代码
from itertools import chain import copy def is_duplicate(item, existing_list): # 深比较判断元素是否已存在 for elem in existing_list: if copy.deepcopy(elem) == copy.deepcopy(item): return True return False my_dict = {'a': [['a', {'x':1}], ['a', {'x':1}]], 'b':[[1,2], [2, {'y':3}]]} merged_list = [] for key, nested_lists in my_dict.items(): flattened = list(chain.from_iterable(nested_lists)) unique_elements = [] for item in flattened: if not is_duplicate(item, unique_elements): unique_elements.append(item) merged_list.append({key: unique_elements}) print(merged_list)
输出结果
[{'a': ['a', {'x': 1}]}, {'b': [1, 2, {'y': 3}]}]
内容的提问来源于stack exchange,提问作者SteveS
相关产品推荐
相关产品推荐

