使用collections.defaultdict(list)出现TypeError: unhashable type: 'list'错误求助
解决TypeError: unhashable type: 'list'问题
问题场景
尝试用collections.defaultdict(list)关联数据框的文本列与图片路径列,编写的代码如下:
image_path_to_caption = collections.defaultdict(list) import pandas as pd df = pd.read_csv("/content/drive/MyDrive/IU-Xray/my_data.csv") extensions = ('.png','.jpg','.jpeg') path = '/conent/drive/MyDrive/iuxray/images/images_normalized' images = df[df['filename'].str.endswith(extensions)]['filename'] findings = df['findings'] paths = [f'{path}/{i}' for i in images] image_path_to_caption[paths].append(findings)
执行image_path_to_caption[paths].append(findings)时出现错误:
TypeError: unhashable type: 'list'
错误原因
字典的键必须是可哈希的不可变类型(如字符串、整数、元组等),而paths是一个列表,列表属于可变类型无法被哈希,因此不能作为字典的键。同时findings是整个数据框的列对象,直接append会把整个Series添加进去,不符合“单条文本对应单条路径”的关联需求。
修正方案
步骤说明
- 调整导入顺序,先加载所需模块
- 过滤数据框时保留完整行,确保
filename和findings的索引严格匹配 - 遍历每一对路径与文本,逐个添加到
defaultdict中
修正后代码
import pandas as pd from collections import defaultdict # 初始化defaultdict image_path_to_caption = defaultdict(list) df = pd.read_csv("/content/drive/MyDrive/IU-Xray/my_data.csv") extensions = ('.png','.jpg','.jpeg') path = '/content/drive/MyDrive/iuxray/images/images_normalized' # 过滤出含有效图片格式的行,保证filename与findings一一对应 filtered_df = df[df['filename'].str.endswith(extensions)] # 遍历每一行,关联路径与对应文本 for filename, finding in zip(filtered_df['filename'], filtered_df['findings']): img_full_path = f"{path}/{filename}" image_path_to_caption[img_full_path].append(finding)
代码解释
- 先过滤整个数据框
filtered_df,避免单独提取列导致的索引错位问题 - 用
zip配对每一行的filename和findings,确保每条文本都对应正确的图片路径 - 以单个字符串格式的图片路径作为键,将对应文本添加到该键的列表中,完全匹配
defaultdict(list)的使用逻辑
内容的提问来源于stack exchange,提问作者user19686684
相关产品推荐
相关产品推荐

