You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python列表推导报错TypeError: unhashable type: 'list'求助

解决TypeError: unhashable type: 'list'的问题

这个错误的核心原因很明确:集合(set)的成员检查要求元素是可哈希的类型,而列表(list)是可变对象,属于不可哈希类型,所以当你尝试用列表类型的元素去集合里查找时,就会触发这个报错。

咱们一步步拆解问题并解决:

第一步:确认问题根源

先检查你的input数组里的元素类型——大概率是其中的元素e是列表类型,而不是你预期的字符串URL。你可以用print(type(input[0]))来验证这一点。

而你的malicious_urls集合里应该是存储的字符串类型URL(毕竟'' in malicious_urls返回False,说明集合里的元素是字符串类的可哈希对象),两者类型不匹配,才导致了报错。

第二步:根据实际场景选择解决方案

场景1:input里的元素是单元素列表(比如每个元素是["https://malicious.example.com"]

如果你的input里每个列表元素只包含一个URL字符串,那可以直接提取列表的第一个元素来做检查:

[e[0] in malicious_urls for e in input]

注意:如果存在空列表或者多元素列表,可能需要额外做判断,比如加个条件避免索引错误:[e[0] in malicious_urls if e else False for e in input]

场景2:input里的元素是包含多个URL的列表,需要检查每个子元素

如果你的input每个元素本身就是一个URL列表,想要检查列表里的每个URL是否恶意,可以用嵌套列表推导式:

[[url in malicious_urls for url in url_list] for url_list in input]

这样会得到一个二维布尔列表,对应每个子列表里的URL检查结果。

场景3:input的元素类型被错误地转为了列表(原本应该是字符串)

如果是因为某些操作把URL字符串不小心转成了列表(比如拆分后没合并),那可以先把列表转回字符串再检查。比如如果是按字符拆分的列表,可以用join合并:

# 先修复input的元素类型
fixed_input = [''.join(url_list) for url_list in input]
# 再执行检查
[url in malicious_urls for url in fixed_input]

验证方案

执行完上面的方案后,你可以先拿单个元素测试:

# 取input里的第一个元素,处理后检查
test_element = input[0]
# 比如场景1的处理
print(test_element[0] in malicious_urls)

确认单个元素没问题后,再运行列表推导式就不会报错了。

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

火山引擎 最新活动