Julia程序为何以'macross_base'为键查询?键错误问题求助
Julia KeyError 问题解析:为何传入数组键却尝试用内部元素查询?
问题详情
我用Julia编写程序时遇到了KeyError,无法定位原因。相关代码片段如下:
try println("THIS IS s[ [j, k] ]: ", s [ [j, k] ]) catch e println("THIS IS s: ", s) println("THIS IS j: ", j) println("THIS IS k: ", k) println("THIS IS [j, k]: ", [j, k]) end
使用try-catch捕获时,输出信息显示:
s是一个以数组为键的字典,键的形式类似[["macross_base", 50400], "Oversized_Equipment"]j的值为["macross_base", 50400],k的值为"Oversized_Equipment"[j, k]的结果确实是[["macross_base", 50400], "Oversized_Equipment"]
不使用try-catch时,程序直接抛出KeyError,提示找不到键"macross_base"。
我的疑惑:明明传入的查询键是[j, k],程序为何会尝试以"macross_base"作为键查询s?
原因分析
这是Julia中字典索引操作的语义优先级导致的:
当你执行s[[j, k]]时,Julia会将数组[j, k]解析为一组要查询的键的集合,而非单个复合键。也就是说,Julia会尝试依次查询s中的键j和键k:
- 首先查询键
j(即["macross_base", 50400]); - 而
j本身也是一个数组,此时Julia再次将其解析为键的集合,尝试查询s中的键"macross_base"(j的第一个元素),但s中不存在这个键,因此抛出KeyError。
简单来说,嵌套的数组索引被Julia逐层拆解为多个键的查询请求,而非你预期的单个复合键查询。
解决方法
要将[j, k]作为单个复合键查询字典,需要明确告知Julia这是一个单一键而非键集合,推荐两种方式:
1. 使用元组作为复合键(推荐)
元组是不可变类型,比数组更适合作为字典键(避免后续修改数组内容导致键失效的问题):
# 将查询键改为元组 println("THIS IS s[(j, k)]: ", s[(j, k)])
如果你的字典原本就用数组作为键,需要先将字典的键批量转换为元组,比如:
# 转换数组键为元组键 new_s = Dict((Tuple(k) => v) for (k, v) in s)
2. 强制将数组识别为单个键
如果必须保留数组作为键,可以显式指定类型,确保Julia将其视为单个键:
# 显式声明数组类型,避免被解析为键集合 println("THIS IS s[[j, k]]: ", s[[j, k]::Vector]) # 或者直接调用单键版本的getindex println("THIS IS s[[j, k]]: ", getindex(s, [j, k]))
内容的提问来源于stack exchange,提问作者graphtheory123
相关产品推荐
相关产品推荐

