我有map[str, int]
,需要在地图中找到最大int
值。
是否可以将地图的所有值作为列表,然后执行max(list)
?
或类似的东西..
答案 0 :(得分:0)
您可以通过几种不同的方式获取值。作为参考,请说我们有以下地图:
rascal>map[str words, int counts] m = ( "word1" : 3, "word2" : 10, "word3" : 4, "word4" : 10);
map[str words, int counts]: ("word1":3,"word2":10,"word3":4,"word4":10)
您可以将其视为保留文字及其在文档中出现的频率。现在有几种方法可以取回价值。由于我们在声明m
(分别为words
和counts
的类型)时给了域和范围两个名称,我们可以使用这些名称来获取值。例如:
rascal>m.words;
set[str]: {"word1","word2","word3","word4"}
取回钥匙,同时:
rascal>m.counts;
set[int]: {10,3,4}
获取值。您也可以使用"投影"符号,突出键或值,如下:
rascal>m<0>;
set[str]: {"word1","word2","word3","word4"}
rascal>m<1>;
set[int]: {10,3,4}
即使我们没有在域中添加名称和类型范围,这也有效。第三个选项,即使我们不添加名称也可以使用,您可以使用Map
库中的库函数:
rascal>import Map;
ok
rascal>domain(m);
set[str]: {"word1","word2","word3","word4"}
rascal>range(m);
set[int]: {10,3,4}
现在我们有了一个包含值的集合,您可以使用max
库中的Set
函数来查找最大数字:
rascal>import Set;
ok
rascal>max(m.counts);
int: 10
如果您真正想要的是具有此值的键或键,您现在有不同的选项。 Map
库包含一个名为invert
的函数,它将&#34;翻转&#34;键和值。由于您可以使用具有相同值的多个键,因此实际上会为您提供从值到具有此值的所有键的映射。在我们的例子中,这看起来像这样:
rascal>invert(m);
map[int, set[str]]: (
10:{"word2","word4"},
3:{"word1"},
4:{"word3"}
)
因此,如果我们想要找回具有最大数值的单词,我们可以执行以下操作:
rascal>invert(m)[max(m.counts)];
set[str]: {"word2","word4"}