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

Posted

技术标签:

【中文标题】通过在 Raku 中对它们的值进行分组来打印散列元素【英文标题】:Print the hash elements by grouping their values in Raku 【发布时间】:2020-09-05 12:33:41 【问题描述】:

我会记录一个字母在一个单词中出现的次数,例如'嵌入式'

my %x := e => 3, m => 1, b => 1, d => 3, s => 2;

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

# e and d 3 times
# m and b 1 times
# s 2 times

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

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

【问题讨论】:

我对您想要生成的输出格式有点困惑。当元素具有相同的值时,是否要将它们分组并打印在一行上(就像使用 # e and d 3 times 的方式一样)?或者您想将它们打印在不同的行上(就像您使用mb 那样)?或者您是否有意将具有 1 值的元素与具有其他值的元素区别对待? @codesections 行动!你是对的。我刚刚编辑了问题。 say %x.categorize(*.value).map( .value».key.join(" ") ~ " " ~ .key ~ " times").join("\n") 必须运行,但我会留给其他人使用“和”来制定答案/句柄 @user0721090601 我已经运行它并且它可以工作:) 当你可以使用.Bag 时,我希望你没有编写代码来创建一个用于跟踪字母计数的哈希。 'embeddedss'.comb.Bag 【参考方案1】:

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

%x.categorize(*.value)

这会产生一个散列,键是用于分类的值,值是来自原始散列 ($x) 的对。这可以使用for.map 循环。您最初计算的字母是Pairs的关键,可以使用.map整齐地提取。

for %x.categorize(*.value) 
    say "$_.value.map(*.key).join(' and ') $_.key times";

(可选)您还可以使用.sort 按出现次数对列表进行排序。这将首先对最小的数字进行排序,但添加一个简单的.reverse 将使最高值排在第一位。

for %x.categorize(*.value).sort.reverse 
     say "$_.value.map(*.key).join(' and ') $_.key times";

【讨论】:

以上是关于通过在 Raku 中对它们的值进行分组来打印散列元素的主要内容,如果未能解决你的问题,请参考以下文章

如何在每个循环中对 Json 对象进行分组

如何通过在 Laravel 中对库存单位进行分组来找到畅销书?

有没有办法根据小数位在python中对数组/列表的值进行动态分组?

通过对数据框列中的值进行分组来绘制多个图?

如何在 D3 中对绑定到不同数据(与 forcesimulatoin 一起使用)的元素进行分组,以便对它们进行排序

shiro学习三