如何根据 Julia 中的键对字典进行排序?

Qwe*_*rty 4 julia

我想在 Julia 中对以下字典进行排序,键值按键名称的字母顺序打印。

fruits = Dict("Mangoes" => 5, "Pomegranates" => 4, "Apples" => 8);
Run Code Online (Sandbox Code Playgroud)

执行上述代码并输入fruits,我得到的输出为:

fruits
Dict{String,Int64} with 3 entries:
  "Pomegranates" => 4
  "Apples"       => 8
  "Mangoes"      => 5
Run Code Online (Sandbox Code Playgroud)

但是,我期望以下结果:

Apples       => 8
Mangoes      => 5
Pomegranates => 4
Run Code Online (Sandbox Code Playgroud)

ffe*_*tte 6

这是因为Julia () 中的字典Dict是无序的:每个字典都维护一键。当迭代此集合时获取键的顺序未定义,并且可能会随着插入新条目而变化。可以做两件事来确保以特定顺序迭代字典条目。


第一种方法是获取键集(使用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
Run Code Online (Sandbox Code Playgroud)


话虽这么说,如果键的顺序很重要,人们可能希望通过使用有序字典(OrderedDict)在类型系统中反映这一事实,有序字典是一种数据结构,其中条目的顺序是有意义的。更准确地说, anOrderedDict保留其条目的插入顺序。

人们可以OrderedDict从头开始创建一个,按顺序插入键,并且顺序将被保留。或者可以简单地使用OrderedDict现有的创建一个,它将按其键的升序对条目进行排序:Dictsort

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"
Run Code Online (Sandbox Code Playgroud)