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




