Python生成Excel遇TypeError: unhashable type: 'list'的解决方法
错误原因与解决方法
错误根源
你遇到的TypeError: unhashable type: 'list'是因为id, t1, t2, t3, t4, t5中至少有一个参数是列表(list)类型。集合(set)中的元素必须是可哈希的,而列表是不可哈希的——哪怕你把这些元素打包成tuple,只要tuple里包含列表,整个tuple依然不可哈希,导致无法添加到seen集合中。
修复现有代码
要解决这个问题,需要把所有可能是列表的参数转换成可哈希的类型(比如tuple),再生成用于判断重复的key:
res = [] res2 = [] seen = set() def to_hashable(item): # 将列表转为tuple,其他类型保持不变 return tuple(item) if isinstance(item, list) else item def add_entry(res, id, t1, t2, t3, t4, t5): # 生成可哈希的key key = tuple([to_hashable(id), to_hashable(t1), to_hashable(t2), to_hashable(t3), to_hashable(t4), to_hashable(t5)]) seen.add(key) res.append({'Display ID': id, 'title': t1, 'affectedEntities': t2, 'impactedEntities': t3, 'startTime': t4, 'endTime': t5}) return res def doppie(res2, id, t1, t2, t3, t4, t5): key = tuple([to_hashable(id), to_hashable(t1), to_hashable(t2), to_hashable(t3), to_hashable(t4), to_hashable(t5)]) if key in seen: res2.append({'Display ID': id, 'title': t1, 'affectedEntities': t2, 'impactedEntities': t3, 'startTime': t4, 'endTime': t5}) return res2 # 你的数据收集逻辑 args = [m, t1, t2, t3, t4, t5] res = add_entry(res, *args) res2 = doppie(res2, m, t1, t2, t3, t4, t5) # 写入Excel writer = pd.ExcelWriter("tabella.xlsx", engine="xlsxwriter") CreateExcel2(res, writer, "sheet 1") CreateExcel2(res2, writer, "sheet 2") writer.close()
更优实现方案
既然你已经在使用pandas,直接利用pandas的DataFrame处理重复数据会更简洁高效,无需手动维护集合和列表:
import pandas as pd # 第一步:收集所有数据到列表(替换成你实际的数据收集逻辑) all_data = [] # 示例:循环收集数据 # for ...: # all_data.append({ # 'Display ID': m, # 'title': t1, # 'affectedEntities': t2, # 'impactedEntities': t3, # 'startTime': t4, # 'endTime': t5 # }) # 转成DataFrame df = pd.DataFrame(all_data) # 生成两个工作表的数据 # sheet1:所有原始数据 sheet1_data = df.copy() # sheet2:所有重复出现的条目(包括第一次出现的) # 如果只想保留重复的后续条目,把keep=False改成keep='first' sheet2_data = df[df.duplicated( subset=['Display ID', 'title', 'affectedEntities', 'impactedEntities', 'startTime', 'endTime'], keep=False )] # 写入Excel with pd.ExcelWriter("tabella.xlsx", engine="xlsxwriter") as writer: sheet1_data.to_excel(writer, sheet_name="sheet 1", index=False) sheet2_data.to_excel(writer, sheet_name="sheet 2", index=False)
这个方案利用pandas内置的duplicated函数自动识别重复项,代码更简洁,也避免了手动处理哈希问题的麻烦。
内容的提问来源于stack exchange,提问作者MiusiZ
相关产品推荐
相关产品推荐

