Python值为列表的字典求交集时报TypeError: unhashable type: 'list'
解决字典值列表交集的TypeError问题
你遇到的TypeError: unhashable type: 'list'错误,是因为列表是可变类型,无法被哈希,所以不能直接对包含列表值的字典项使用集合交集操作。
解决方案一:使用字典推导式结合集合交集
通过将列表转换为集合来计算交集,再转回列表(如果需要):
a = { 'q1': ['d5', 'd6', 'd90', 'd91', 'd119', 'd144', 'd181', 'd399'], 'q2': ['d236', 'd166'], 'q3': ['d552', 'd401', 'd1297', 'd1296'], 'q4': ['d99', 'd115', 'd257', 'd258'], 'q5': ['d20', 'd56', 'd57', 'd58', 'd19'] } b = { 'q1': ['d707', 'd144', 'd542', 'd329', 'd395', 'd730', 'd158', 'd77', 'd486', 'd623'], 'q2': ['d189', 'd575', 'd179', 'd1182', 'd160', 'd188', 'd660', 'd1061', 'd173', 'd185'], 'q3': ['d730', 'd329', 'd1066', 'd14', 'd163', 'd401', 'd753', 'd44', 'd92', 'd368'], 'q4': ['d798', 'd97', 'd99', 'd927', 'd1195', 'd131', 'd257', 'd315', 'd151', 'd193'], 'q5': ['d189', 'd1347', 'd423', 'd1040', 'd174', 'd1231', 'd197', 'd721', 'd1307', 'd1352'] } # 计算共享键对应值的交集 intersection_dict = { key: list(set(a[key]) & set(b[key])) for key in a.keys() & b.keys() } print(intersection_dict)
运行结果:
{ 'q1': ['d144'], 'q2': [], 'q3': ['d401'], 'q4': ['d99', 'd257'], 'q5': [] }
解决方案二:保留原列表顺序(若需要)
如果需要保留原列表的顺序,或者处理有重复元素的情况,可以用列表推导式:
intersection_dict = { key: [item for item in a[key] if item in set(b[key])] for key in a.keys() & b.keys() }
这种方式会保留a中列表的元素顺序,同时筛选出存在于b列表中的元素。
错误原因说明
你最初使用的dict(ret_docs.items() & reljudges.items())试图直接对字典的项(键值对)求交集,但由于值是列表(不可哈希),集合无法包含这类元素,因此抛出TypeError。必须先针对每个键对应的值列表单独计算交集,而不是对整个字典项进行集合操作。
内容的提问来源于stack exchange,提问作者Hefe
相关产品推荐
相关产品推荐

