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

时间:2020-03-18 17:22:33

标签: julia

我想在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

2 个答案:

答案 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
相关问题