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
相关产品推荐
相关产品推荐

