通过在 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
的方式一样)?或者您想将它们打印在不同的行上(就像您使用m
和b
那样)?或者您是否有意将具有 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 中对它们的值进行分组来打印散列元素的主要内容,如果未能解决你的问题,请参考以下文章
如何通过在 Laravel 中对库存单位进行分组来找到畅销书?
有没有办法根据小数位在python中对数组/列表的值进行动态分组?