有没有一个Raku函数/方法可以允许对排序的哈希数组进行迭代并确定其最大值



我目前正在处理一个哈希数组,该数组已按其键和值进行了排序。我已经成功地将散列分解,这样我就可以分别获取密钥和值。我创建了一个循环函数,它遍历键和值的数组。此外,我有一个最常见的数字变量,它可以跟踪哈希值,理想情况下,每当它在循环中迭代并在最常用的数字变量中找到大于当前值的值时,它就会更新。这就是我的代码:

my $MCNum = 0;
my @sorted_pairs = %counts{$word}.sort: *.kv;
loop (my $i = 0; $i < @sorted_pairs; $i++) {
say "i: ", @sorted_pairs[$i].values;
say "i+1 ",@sorted_pairs[$i+1].values;
if @sorted_pairs[$i].values < @sorted_pairs[$i+1].values {
$MCNum = @sorted_pairs[$i+1].values;
$best_word = @sorted_pairs[$i+1].keys;
say "MCNumber is: ", $MCNum;
}  

当我运行程序时,它会给出以下输出:

Sorted Hash Array: [90's => 1 at => 1 dance => 1 did => 1 does => 1 doesn't => 1 don't => 1 droid => 1 dubwise => 1 feat => 1 hasn't => 1 if => 1 is => 5 letters => 1 life => 1 like => 1 man => 1 me => 5 monsterman => 1 my => 2 scenes => 1 sensation => 1 so => 3 song => 1 survives => 1 theme => 1 triangle => 1 weather => 1 would => 1 y'all => 1 you => 10 your => 1]
i: (1)
i+1 (1)
i: (1)
i+1 (1)
i: (1)
i+1 (1)
i: (1)
i+1 (1)
i: (1)
i+1 (1)
i: (1)
i+1 (1)
i: (1)
i+1 (1)
i: (1)
i+1 (1)
i: (1)
i+1 (1)
i: (1)
i+1 (1)
i: (1)
i+1 (1)
i: (1)
i+1 (5)
i: (5)
i+1 (1)
i: (1)
i+1 (1)
i: (1)
i+1 (1)
i: (1)
i+1 (1)
i: (1)
i+1 (5)
i: (5)
i+1 (1)
i: (1)
i+1 (2)
i: (2)
i+1 (1)
i: (1)
i+1 (1)
i: (1)
i+1 (3)
i: (3)
i+1 (1)
i: (1)
i+1 (1)
i: (1)
i+1 (1)
i: (1)
i+1 (1)
i: (1)
i+1 (1)
i: (1)
i+1 (1)
i: (1)
i+1 (1)
i: (1)
i+1 (10)
i: (10)
i+1 (1)
i: (1)
i+1 ()

这导致了我的困惑,因为我认为当值遇到1时应该跳过它,但当它看到2、5和/或10时,最常见的数字变量值应该更新。相反,我注意到,在运行程序时,它要么永远不会像代码中所示的那样更新,要么一直更新变量,无论数字是小是大。我错过了什么?

我认为您希望在循环中使用valuekey,而不是valueskeys。后者返回列表,当您进行数值比较@sorted_pairs[$i].values < @sorted_pairs[$i+1].values时,您最终会比较这些列表的长度。

这总是一个。

你也可以做一些类似的事情:

my $MCNum = 0;
my @sorted_pairs = %counts{$word}.sort.rotor(2 => -1).map(*.kv);
for my $a, $b ( @sorted_pairs ) {
if $a.value < $b.value {
$MCNum = $b.value;
$best_word = $b.key;
say "MCNumber is: ", $MCNum;
}
}

rotor将类似列表的东西拆分为子列表,如果您将循环跳过长度设置为负数,它会跳过一个元素,因此

(1,2,3,4,5).rotor(2 => -1) ~~ ((1,2),(2,3),(3,4),(4,5))

一般来说,如果我在Raku中看到一个老式的C风格循环,我想有些事情可以简化。(

我不确定这个问题,但可能是您在工作流程中过早地涉及数组。

假设你有一个单词频率列表:

https://stackoverflow.com/a/72053359/7270649

I => 8
the => 7
and => 6
of => 4
to => 4
a => 4

如果在上面的代码生成输出中使用.put而不是.say,则会得到制表符分隔的输出。一行程序可以很容易地获取选项卡分隔的输出,并为您处理它。假设我们连接输出,所以我们有两个副本,第二个副本的值增加+1:

I   8
the 7
and 6
to  4
of  4
a   4
I   9
the 8
and 7
to  5
of  5
a   5

附加到散列(%counts(中会得到以下内容(为了清晰起见,添加了空格(:

~$ raku -e 'my %counts; for lines.map(*.words) { %counts.=append($_) };  
.say for %counts.sort: -*.value.max;' file
I => [8 9]
the => [7 8]
and => [6 7]
to => [4 5]
a => [4 5]
of => [4 5]

从上面的代码中,您所需要的只是对其中任意一个1(添加一条额外的语句。用每个键的单个CCD_ 10值或2来重写散列值(有条件地(。每个密钥用单个sum值覆盖散列值(有条件(:

#Max
~$ raku -e 'my %counts; for lines.map(*.words) { %counts.=append($_) };  
for %counts.kv -> $k,$v { if $v.elems > 1 {%counts{$k} = $v.max }};  
.say for %counts.sort: -*.value;'  file
I => 9
the => 8
and => 7
to => 5
a => 5
of => 5
#Sum
~$ raku -e 'my %counts; for lines.map(*.words) { %counts.=append($_) };  
for %counts.kv -> $k,$v { if $v.elems > 1 {%counts{$k} = $v.sum }};  
.say for %counts.sort: -*.value;'  file
I => 17
the => 15
and => 13
of => 9
a => 9
to => 9

然后。。。可以指定给数组。因此,也许这很有帮助,至少可以为您提供更多关于哈希(以及最终…数组(的"战略"选项

https://docs.raku.org/language/hashmap#In_place_editing_of_values

最新更新