Perl6:按值对哈希进行排序并使用 kv
Perl6: Sorting Hash by Values and using kv
我正在查看以下数据(在 JSON 中)
{
"FValidation_pipelineMTHXT_v4.5.1_refLibV2": "concordance2/f",
"FValidation_pipelineLPJL": "concordance2/c",
"FCompetenceRuns": "concordance2/b",
"FWGS": "concordance2/a",
"Falidation_pipelineMTHXT": "concordance2/e",
"FValidation_pipelineLPJL_v4.5.1_refLibV2": "concordance2/d"
}
我正在尝试按哈希值排序
for %files.kv -> $key, $value {
提供了所需的数据,但我希望对其进行排序。我尝试了大约 20 种不同的方法,但都行不通
for %files.sort.kv -> ($key, $value) {
和
for %files.sort: *.value.kv -> ($key, $value) {
灵感来自 https://docs.perl6.org/routine/sort#(Map)_method_sort
等等,但是 none 正在工作 :(
如何按值对这个散列进行排序?
my %hash = :a<z>, :b<y>, :c<x>;
for %hash.sort(*.value) {
say $_.key;
say $_.value;
}
.kv
returns 扁平序列。
my %h = (
a => 3,
b => 2,
c => 1,
);
say %h.kv.perl;
# ("a", 3, "c", 1, "b", 2).Seq
如果你对它进行排序,那么你就不会保留键及其关联值。
say %h.kv.sort.perl;
# (1, 2, 3, "a", "b", "c").Seq
所以你想在拆分成对之前对其进行排序。
# default sort order (key first, value second)
say %h.sort.perl;
# (:a(3), :b(2), :c(1)).Seq
say %h.sort: *.value; # sort by value only (tied values are in random order)
# (:c(1), :b(2), :a(3)).Seq
say %h.sort: *.invert; # sort by value first, key second
# (:c(1), :b(2), :a(3)).Seq
say %h.sort: *.kv.reverse; # sort by value first, key second
# (:c(1), :b(2), :a(3)).Seq
排序后,您可以将其作为 Pair 对象的序列:
# default $_
for %h.sort: *.invert {
say .key ~ ' => ' ~ .value
}
# extract as named attributes
for %h.sort: *.invert -> (:$key, :$value) {
say "$key => $value"
}
# more explicit form of above
for %h.sort: *.invert -> Pair $ (:key($key), :value($value)) {
say "$key => $value"
}
或者您可以在排序后将这些对分开:
(注意 two-level 结构。)
say %h.sort(*.invert).map(*.kv).perl;
# (("c", 1).Seq, ("b", 2).Seq, ("a", 3).Seq).Seq
say %h.sort(*.invert)».kv.perl;
# (("c", 1).Seq, ("b", 2).Seq, ("a", 3).Seq).Seq
# default $_
for %h.sort(*.invert).map(*.kv) {
say .key ~ ' => ' ~ .value
}
# extract inner positional parameters
for %h.sort(*.invert).map(*.kv) -> ($k,$v) {
say "$k => $v"
}
# `».kv` instead of `.map(*.kv)`
for %h.sort(*.invert)».kv -> ($k,$v) {
say "$k => $v"
}
您甚至可以在拉开成对对象后将其压平。
say %h.sort(*.invert).map(*.kv).flat.perl;
# ("c", 1, "b", 2, "a", 3).Seq
say %h.sort(*.invert)».kv.flat.perl;
# ("c", 1, "b", 2, "a", 3).Seq
for %h.sort(*.invert).map(*.kv).flat -> $k, $v {
say "$k => $v"
}
for %h.sort(*.invert)».kv.flat -> $k, $v {
say "$k => $v"
}
(请注意,».method
仅映射到一个方法调用。要映射到两个方法调用,您需要 ».method1».method2
,或者只使用映射 .map(*.method1.method2)
。
所以在上面的 ».kv.flat
中,只有 .kv
方法被映射到值上。)
我正在查看以下数据(在 JSON 中)
{
"FValidation_pipelineMTHXT_v4.5.1_refLibV2": "concordance2/f",
"FValidation_pipelineLPJL": "concordance2/c",
"FCompetenceRuns": "concordance2/b",
"FWGS": "concordance2/a",
"Falidation_pipelineMTHXT": "concordance2/e",
"FValidation_pipelineLPJL_v4.5.1_refLibV2": "concordance2/d"
}
我正在尝试按哈希值排序
for %files.kv -> $key, $value {
提供了所需的数据,但我希望对其进行排序。我尝试了大约 20 种不同的方法,但都行不通
for %files.sort.kv -> ($key, $value) {
和
for %files.sort: *.value.kv -> ($key, $value) {
灵感来自 https://docs.perl6.org/routine/sort#(Map)_method_sort 等等,但是 none 正在工作 :(
如何按值对这个散列进行排序?
my %hash = :a<z>, :b<y>, :c<x>;
for %hash.sort(*.value) {
say $_.key;
say $_.value;
}
.kv
returns 扁平序列。
my %h = (
a => 3,
b => 2,
c => 1,
);
say %h.kv.perl;
# ("a", 3, "c", 1, "b", 2).Seq
如果你对它进行排序,那么你就不会保留键及其关联值。
say %h.kv.sort.perl;
# (1, 2, 3, "a", "b", "c").Seq
所以你想在拆分成对之前对其进行排序。
# default sort order (key first, value second)
say %h.sort.perl;
# (:a(3), :b(2), :c(1)).Seq
say %h.sort: *.value; # sort by value only (tied values are in random order)
# (:c(1), :b(2), :a(3)).Seq
say %h.sort: *.invert; # sort by value first, key second
# (:c(1), :b(2), :a(3)).Seq
say %h.sort: *.kv.reverse; # sort by value first, key second
# (:c(1), :b(2), :a(3)).Seq
排序后,您可以将其作为 Pair 对象的序列:
# default $_
for %h.sort: *.invert {
say .key ~ ' => ' ~ .value
}
# extract as named attributes
for %h.sort: *.invert -> (:$key, :$value) {
say "$key => $value"
}
# more explicit form of above
for %h.sort: *.invert -> Pair $ (:key($key), :value($value)) {
say "$key => $value"
}
或者您可以在排序后将这些对分开:
(注意 two-level 结构。)
say %h.sort(*.invert).map(*.kv).perl;
# (("c", 1).Seq, ("b", 2).Seq, ("a", 3).Seq).Seq
say %h.sort(*.invert)».kv.perl;
# (("c", 1).Seq, ("b", 2).Seq, ("a", 3).Seq).Seq
# default $_
for %h.sort(*.invert).map(*.kv) {
say .key ~ ' => ' ~ .value
}
# extract inner positional parameters
for %h.sort(*.invert).map(*.kv) -> ($k,$v) {
say "$k => $v"
}
# `».kv` instead of `.map(*.kv)`
for %h.sort(*.invert)».kv -> ($k,$v) {
say "$k => $v"
}
您甚至可以在拉开成对对象后将其压平。
say %h.sort(*.invert).map(*.kv).flat.perl;
# ("c", 1, "b", 2, "a", 3).Seq
say %h.sort(*.invert)».kv.flat.perl;
# ("c", 1, "b", 2, "a", 3).Seq
for %h.sort(*.invert).map(*.kv).flat -> $k, $v {
say "$k => $v"
}
for %h.sort(*.invert)».kv.flat -> $k, $v {
say "$k => $v"
}
(请注意,».method
仅映射到一个方法调用。要映射到两个方法调用,您需要 ».method1».method2
,或者只使用映射 .map(*.method1.method2)
。
所以在上面的 ».kv.flat
中,只有 .kv
方法被映射到值上。)