通过在 Raku 中对它们的值进行分组来打印散列元素

Lar*_*een 7 hash raku

我会记录一个字母在一个单词中出现的次数,例如“embeddedss”

my %x := {e => 3, m => 1, b => 1, d => 3, s => 2};
Run Code Online (Sandbox Code Playgroud)

我想通过像这样对它们的值进行分组来打印元素:

# e and d 3 times
# m and b 1 times
# s 2 times
Run Code Online (Sandbox Code Playgroud)

如何实际做到这一点,即不构建循环(如果有的话)?

可选在打印散列之前,我想将其转换并分配为临时数据结构,例如( <3 e d>, <1 m b>, <2 s> )然后打印它。最实用的数据结构和打印方式是什么?

Tyi*_*yil 8

.categorize按照评论中的建议使用,您可以根据值将它们组合在一起。

%x.categorize(*.value)
Run Code Online (Sandbox Code Playgroud)

这会产生一个哈希,键是用于分类的值,值是来自原始哈希 ( $x) 的Pairs 。这可以循环使用for.map。您最初计算的字母是 Pairs 的键,可以使用.map.

for %x.categorize(*.value) {
    say "{$_.value.map(*.key).join(' and ')} {$_.key} times";
}
Run Code Online (Sandbox Code Playgroud)

或者,您还可以使用.sort. 这将首先对最低数字进行排序,但添加一个简单的数字.reverse将使最高值先出现。

for %x.categorize(*.value).sort.reverse {
     say "{$_.value.map(*.key).join(' and ')} {$_.key} times";
}
Run Code Online (Sandbox Code Playgroud)