问题 如何在Perl 6的列表中找到最大值的索引?


在Perl 6中找到列表中的最大值很容易:

> my @list = 1,4,9,7,3;
> say @list.max;
9

但如果我想找到 指数 最大入口,似乎没有一种优雅的方式来做到这一点。

> say (^@list).sort({ -@list[$_] })[0];
2
> say @list.pairs.sort(*.value).tail.key;
2
> say @list.first(@list.max, :k);
2

这些都是有效的,但它们并不优雅,更不用说高效了。

有一个更好的方法吗?

如果,那会很好 max 有 :k:v 和 :kv 选项,比如说 first 具有。 当然,可能没有  一个独特的索引(例如,在...的情况下) (1,4,9,7,9).max,但话又说回来,可能没有一个独特的  之一:

> dd (1, 2.0, 2.0e0, 2).max;
2.0
> say <the quick brown fox>.max(*.chars);
quick

max 已经检索到了 第一 最大值,所以返回第一个是完全合理的 指数 同 :k (要么 :kv)。


7801
2018-01-09 18:38


起源

我才意识到这一点 该 最大值的索引可能不存在,例如,如果列表是 1,4,9,7,3,9,1。但仍然是一种更优雅的方式 一个 索引将是受欢迎的。 - mscha
返回值时没有什么不同。例如。 dd (1, "2", 2).max(*.Int); 返回Str值 "2" 而不是Int值 2,因为它是第一位的。所以 .max(:k) 返回第一个匹配索引将完全符合现有行为,我会考虑这里不支持副词,这是疏忽。 - smls
好点子。一个更好的例子可能是 dd(1, 2.0e0, 2.0, 2).max;。 - mscha
我在这个问题上添加了关于此的最后一节。 - mscha


答案:


您可以使用

@list.maxpairs

获得所有索引和最大值对的列表或

@list.pairs.max(*.value).key

只获得一个索引。

据我所知,两者兼而有之 maxpairs 以及提供转型的能力 max 仍然没有证件。


13
2018-01-09 19:34



谢谢,两个不错的选择。 (事实上​​,两者都没有记录。) - mscha
@mscha你是否为未记录的内容提交了文档问题? - Aleks-Daniel Jakimenko-A.