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

Python从.gz文件生成字典报错:TypeError: unhashable type: 'list'

解决从.gz文件生成字典时的TypeError: unhashable type: 'list'问题

嘿,我来帮你搞定这个报错!这个错误的核心原因很明确:你试图把一个列表(list)当作字典的键来使用了,而字典的键必须是可哈希(hashable)的类型——列表是可变的,属于不可哈希类型,自然就触发这个TypeError了。

先看一个典型的错误场景

假设你的代码大概是这样的(读取.gz文件后分割行内容,把列表片段当键):

import gzip

def parse_gz_to_dict(file_path):
    output_dict = {}
    with gzip.open(file_path, 'rt', encoding='utf-8') as f:
        for line in f:
            data_parts = line.strip().split('\t')  # 假设用制表符分割
            # 错误:把列表data_parts[0:2]作为字典的键
            output_dict[data_parts[0:2]] = data_parts[2]
    return output_dict

运行这段代码就会直接抛出TypeError: unhashable type: 'list',因为data_parts[0:2]是一个列表,不能当字典键。

两种快速修正方案

方案1:把列表转成元组(Tuple)

元组是不可变的,属于可哈希类型,完美替代列表当键:

import gzip

def parse_gz_to_dict(file_path):
    output_dict = {}
    with gzip.open(file_path, 'rt', encoding='utf-8') as f:
        for line in f:
            data_parts = line.strip().split('\t')
            # 将列表转成元组作为键
            output_dict[tuple(data_parts[0:2])] = data_parts[2]
    return output_dict

方案2:把列表元素拼接成字符串

如果更习惯用字符串当键,可以用分隔符把列表元素拼起来:

import gzip

def parse_gz_to_dict(file_path):
    output_dict = {}
    with gzip.open(file_path, 'rt', encoding='utf-8') as f:
        for line in f:
            data_parts = line.strip().split('\t')
            # 用下划线(或其他分隔符)拼接成字符串键
            key = '_'.join(data_parts[0:2])
            output_dict[key] = data_parts[2]
    return output_dict

额外场景提醒:如果.gz里是JSON数据

如果你的.gz文件存储的是JSON内容,要注意解析后的数据里有没有把列表当作键的情况。比如JSON里的键是字符串形式的"[1,2]",但如果你自己把它转成了列表再当键,也会报错。这时候要确保最终用作字典键的是可哈希类型。

总的来说,你只需要排查代码里所有给字典赋值键的地方,把列表换成元组、字符串或其他可哈希类型,问题就能解决啦!

内容的提问来源于stack exchange,提问作者Preetesh Gaitonde

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:39:02