如何在列表中选择指定元素求交集?解决unhashable type: 'list'错误
冰球比赛数据列表求交集问题
需求说明
需要对两个存储冰球比赛数据的列表求交集,仅针对比赛信息维度(即hockeymatch对应的内容,比如('Seattle-Minnesota', 'NHL', '18:00'))进行运算,输出共同的比赛信息,同时需排除:
- 同一比赛行中不同的数值(如
[1.33]、[62.0]这类与其他列表中对应数值不同的内容) - 非共同的比赛信息(如
'Dallas-Arizona', 'NHL', '15:00'这类仅在单个列表中存在的比赛)
核心要求:
- 未来新增比赛时能自动识别所有共同比赛,无需手动指定
- 能明确区分每行数据中的
hockeymatch、number1、number2字段
报错信息
运行现有代码时触发如下错误:
TypeError: unhashable type: 'list'
期望输出
('Seattle-Minnesota', 'NHL', '18:00')
现有代码示例
#x = [] #x.append([[hockeymatch], [number1], [number2]]) x = [[[('Dallas-Arizona', 'NHL', '15:00')], [1.75], [87.5]], [('Seattle-Minnesota', 'NHL', '18:00')], [2.5], [125.0]] #y = [] #y.append([[hockeymatch], [number1], [number2]]) y = [[[('Seattle-Minnesota', 'NHL', '18:00')], [1.33], [62.0]], [('Vancouver-Vegas', 'NHL', '20:00')], [0.50], [43.0]] test = list(set(x[0]).intersection(y[0])) print(test)
问题分析与解决方法
问题根源
- 报错原因:
set()要求元素为可哈希类型,但列表(list)是不可哈希的,直接将x[0]、y[0]放入集合会触发错误。 - 数据结构混乱:现有
x、y的格式不统一,部分元素是嵌套列表,部分是单层结构,无法批量处理比赛数据。
修正方案
步骤1:统一数据结构
将每场比赛的信息封装为统一格式的子列表:[hockeymatch, number1, number2],其中hockeymatch用元组(可哈希类型)存储:
# 统一结构:每个子列表对应一场比赛,格式为 [比赛信息元组, 数值1, 数值2] x = [ [('Dallas-Arizona', 'NHL', '15:00'), 1.75, 87.5], [('Seattle-Minnesota', 'NHL', '18:00'), 2.5, 125.0] ] y = [ [('Seattle-Minnesota', 'NHL', '18:00'), 1.33, 62.0], [('Vancouver-Vegas', 'NHL', '20:00'), 0.50, 43.0] ]
步骤2:提取比赛信息并求交集
用集合推导式提取所有比赛信息,通过集合运算快速求交集:
# 提取x中所有比赛信息 x_matches = {match[0] for match in x} # 提取y中所有比赛信息 y_matches = {match[0] for match in y} # 计算交集 common_matches = x_matches & y_matches # 输出结果 for match in common_matches: print(match)
方案优势
- 元组可哈希,解决了
unhashable type的报错问题 - 统一的数据结构支持自动识别新增比赛,无需修改核心逻辑
- 集合运算高效,能快速处理大量比赛数据
内容的提问来源于stack exchange,提问作者user20812299
相关产品推荐
相关产品推荐

