TCL как отсортировать вложенный словарь по значению - PullRequest
0 голосов
/ 18 марта 2020

Ввод представляет собой словарь с именем b

puts $b
h1 {tP 20} h2 {tP 30} h3 {tP 40} h4 {tP 50}

Цель - сортировать этот дикт по значениям tP.

Функция, которую я имею до сих пор, равна

proc sortValue {dict args} {
    set l {}
    dict for {k v} $dict {
        lappend l [list $k $v]
    }
    return [concat {*}[lsort -real -decreasing -index 1 {*}$args $l]]
}

Как я могу изменить это, чтобы войти в диктовку другого уровня?

Ожидаемый результат

h4 {tP 50} h3 {tP 40} h2 {tP 30} h1 {tP 20}

1 Ответ

1 голос
/ 18 марта 2020

Рассматривать диктовку как список с четным числом элементов (которое оно есть)

lsort -integer -decreasing -stride 2 -index {end end} $b
h4 {tP 50} h3 {tP 40} h2 {tP 30} h1 {tP 20}

Первый «конец» - это доступ к последнему элементу шага, второй » end "- это доступ к последнему элементу этого индекса.


Вы можете сделать это в 8.5

set temp [list]
set sorted [dict create]

dict for {key value} $b {
    lappend temp [list $key $value]
}
foreach pair [lsort -integer -decreasing -index {end end} $temp] {
    dict set sorted {*}$pair
}

, только что увидев ваш отредактированный комментарий: да, конечно, это изменится. Вот немного преобразования Шварца:

% set b {h1 {tP 20 lp 1} h2 {tP 30 lp 2} h3 {tP 40 lp 3} h4 {tP 50 lp 4} }
h1 {tP 20 lp 1} h2 {tP 30 lp 2} h3 {tP 40 lp 3} h4 {tP 50 lp 4}
% set temp [list]
% dict for {key subdict} $b {lappend temp [list [dict get $subdict tP] $key $subdict]}
% set sorted [dict create]
% foreach tuple [lsort -int -decr -index 0 $temp] {dict set sorted {*}[lrange $tuple 1 end]}
% set sorted
h4 {tP 50 lp 4} h3 {tP 40 lp 3} h2 {tP 30 lp 2} h1 {tP 20 lp 1}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...