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

Python实现关系复合R2◦R1函数报unhashable type list错误求解

复合关系计算函数修改方案

报错原因

原有代码仅支持单值映射的关系计算,当R1的value是列表类型时,直接将列表作为键传入R2[]查询,而列表是不可哈希类型,无法作为字典的key,因此触发unhashable type list报错。

实现思路

按照复合关系的数学定义处理一对多映射场景:

  • 遍历R1的每个键k,以及k对应的所有映射值v1
  • 对每个v1,查询R2中对应的所有映射值v2
  • 把所有v2合并后去重,作为k在复合关系中的值

修改后代码

def composition(R1, R2):
    result = {}
    for k, v1_list in R1.items():
        # 兼容单值和多值两种输入格式
        if not isinstance(v1_list, (list, tuple, set)):
            v1_list = [v1_list]
        temp = []
        for v1 in v1_list:
            v2_list = R2.get(v1, [])
            if not isinstance(v2_list, (list, tuple, set)):
                v2_list = [v2_list]
            temp.extend(v2_list)
        # 去重同时保留元素顺序,不需要顺序可替换为 list(set(temp))
        result[k] = list(dict.fromkeys(temp))
    return result

测试验证

单值映射测试

R1 = {1:'a',2:'b',3:'c'}
R2 = {'a':'A','b':'B','c':'C'}
print(composition(R1, R2))

输出:{1: ['A'], 2: ['B'], 3: ['C']},如果需要输出和原有逻辑一致的单值格式,可额外增加长度判断返回单个元素。

一对多映射测试

R1 = {1 : [2, 3], 2 : [3], 3 : [4], 4 : [1, 3]}
R2 = {1 : [3], 2 : [1, 4], 3 : [2], 4 : [1, 2]}
print("R2 ◦ R1 =", composition(R1, R2))

输出符合预期:R2 ◦ R1 = {1: [1, 4, 2], 2: [2], 3: [1, 2], 4: [3, 2]},对元素顺序无要求时和预期结果完全等价。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 03:18:02