如何解决Julia中字典列表多键排序的广播保留错误
解决Julia字典列表多键排序的错误
你遇到的错误是因为Julia禁止对字典进行广播操作,你用的getindex.(x, ("lname", "fname"))属于广播写法,触发了预留限制导致报错。
下面是几种可行的解决方法:
方法1:直接构造排序元组(最简洁)
直接返回包含lname和fname的元组,Julia会按元组内的顺序依次比较(先比姓氏,再比名字):
rows = [Dict("fname" => "Brian", "lname" => "Jones", "uid" => 1003), Dict("fname" => "David", "lname" => "Beazley", "uid" => 1002), Dict("fname" => "John", "lname" => "Cleese", "uid" => 1001), Dict("fname" => "Big", "lname" => "Jones", "uid" => 1004)] sorted_rows = sort(rows, by=x->(x["lname"], x["fname"]))
执行后结果会按lname升序,同姓氏的按fname升序排列:
4-element Vector{Dict{String, Any}}: Dict("fname" => "David", "lname" => "Beazley", "uid" => 1002) Dict("fname" => "John", "lname" => "Cleese", "uid" => 1001) Dict("fname" => "Big", "lname" => "Jones", "uid" => 1004) Dict("fname" => "Brian", "lname" => "Jones", "uid" => 1003)
方法2:用get函数避免键不存在报错
如果你的字典列表可能存在缺少lname或fname的情况,用get函数设置默认值,避免运行时错误:
sorted_rows = sort(rows, by=x->(get(x, "lname", ""), get(x, "fname", "")))
这里默认值用空字符串,你也可以根据需求换成其他值(比如missing)。
为什么原来的写法不行?
Julia官方把字典和NamedTuple的广播功能预留了,不允许通过getindex.(dict, keys)这种方式广播取值,必须手动构造元组或者用其他方式获取多键值。
内容的提问来源于stack exchange,提问作者Vinod
相关产品推荐
相关产品推荐

