You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

处理字典值中嵌套列表展平与去重时遇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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 13:15:39