Как отсортировать словарь по ключам в Юлии? - PullRequest
2 голосов
/ 18 марта 2020

Я хочу отсортировать следующий словарь в 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 ]

4 голосов
/ 18 марта 2020

Это потому, что словари в Юлии (Dict) не упорядочены: каждый словарь поддерживает набор ключей. Порядок получения ключей при итерации по этому набору не определен и может варьироваться при добавлении новых записей. Есть две вещи, которые можно сделать, чтобы убедиться, что каждый выполняет итерацию по словарным записям в указанном c порядке.

Первый способ - получить набор ключей (используя 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

При этом, если порядок ключей важен, можно отразить этот факт в системе типов, используя упорядоченный словарь ( 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"
2 голосов
/ 18 марта 2020

Попробуйте:

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
...