我想在Julia中对以下字典进行排序,以使键值按键名的字母顺序打印。
fruits = Dict("Mangoes" => 5, "Pomegranates" => 4, "Apples" => 8);
在执行上述代码并输入fruits
时,我得到的输出为:
fruits
Dict{String,Int64} with 3 entries:
"Pomegranates" => 4
"Apples" => 8
"Mangoes" => 5
但是,我希望得到以下结果:
Apples => 8
Mangoes => 5
Pomegranates => 4
答案 0 :(得分:4)
这是因为Julia(Dict
)中的dictionaries没有排序:每个字典都维护一个 set 键。当一个在此集合上进行迭代时,获取密钥的顺序尚未定义,并且可以随着插入新条目而变化。为了确保以特定顺序对字典条目进行迭代,可以做两件事。
第一种方法是获取键集(使用keys
)并自己对其进行排序,如另一个答案中所建议的那样:
julia> fruits = Dict("Mangoes" => 5, "Pomegranates" => 4, "Apples" => 8);
julia> for key in sort!(collect(keys(fruits)))
val = fruits[key]
println("$key => $val")
end
Apples => 8
Mangoes => 5
Pomegranates => 4
话虽如此,如果键的顺序很重要,则可能希望通过使用 ordered 字典(OrderedDict)在类型系统中反映这一事实,该字典是一种数据条目顺序有意义的结构。更准确地说,OrderedDict
保留了其条目的插入顺序。
一个人可以从头开始创建OrderedDict
,注意按顺序插入键,然后顺序将被保留。或者,您可以仅使用OrderedDict
从现有Dict
创建sort
,这将按其键的升序对条目进行排序:
julia> using OrderedCollections
julia> fruits = Dict("Mangoes" => 5, "Pomegranates" => 4, "Apples" => 8);
julia> ordered_fruits = sort(fruits)
OrderedDict{String,Int64} with 3 entries:
"Apples" => 8
"Mangoes" => 5
"Pomegranates" => 4
julia> keys(ordered_fruits)
Base.KeySet for a OrderedDict{String,Int64} with 3 entries. Keys:
"Apples"
"Mangoes"
"Pomegranates"
答案 1 :(得分:2)
尝试一下:
fruits = Dict("Mangoes" => 5, "Pomegranates" => 4, "Apples" => 8);
for key in sort(collect(keys(fruits)))
println("$key => $(fruits[key])")
end
它给出以下结果:
Apples => 8
Mangoes => 5
Pomegranates => 4