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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 22:09:57