如何按值对地图进行排序,如果值等于则在Go中按键排序?

我遇到了一种情况,我想先按值对地图进行排序,如果值相等,然后在 GO 中按键排序。这是输入和预期输出的示例。


import "fmt"


func main() {

     wordFrequency := map[string]int{"banana": 3, "america": 2, "abb": 2, "test": 2, "car": 1}

     fmt.Printf("%v", wordFrequency)

}

预期输出:{“香蕉”:3,“abb”:2,“美国”:2,“测试”:2,“汽车”:1}


这里的banana是第一个,因为它的值是3。abb和america的值都是2,但是abb排在第一位,按升序排列。所以我的问题是如何实现这种行为,我们首先按值对映射中的条目进行排序,如果值等于我们按键对它们进行排序。我检查了相关文档和以前的问题,但没有一个直接解决这种情况。如果由于 Go 中的 map 数据结构而无法做到这一点,我们如何使用其他结构有效地做到这一点?


在 Python 3 中,我们可以通过以下方式做到这一点


>>> d = {'apple':2, 'banana':3, 'almond':2, 'beetroot':3, 'peach':4}

>>> [k for k, v in sorted(d.iteritems(), key=lambda(k, v): (-v, k))]

['peach', 'banana', 'beetroot', 'almond', 'apple']

这是 Python 链接的等效问题的链接


注意:这个问题询问如何按值对地图进行排序。我的问题是特定于按值排序,然后按键(如果值等于)。




茅侃侃
浏览 81回答 1
1回答

HUX布斯

您无法对map.将 转换map为键值对结构的切片。对切片进行排序(另请参见如何使用多个排序参数对结构进行排序?)例如像这样:func main() {&nbsp; &nbsp; wordFrequency := map[string]int{"banana": 3, "america": 2, "abb": 2, "test": 2, "car": 1}&nbsp; &nbsp; vec := mapToSlice(wordFrequency)&nbsp; &nbsp; sort.Slice(vec, func(i, j int) bool {&nbsp; &nbsp; &nbsp; &nbsp; // 1. value is different - sort by value (in reverse order)&nbsp; &nbsp; &nbsp; &nbsp; if vec[i].value != vec[j].value {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return vec[i].value > vec[j].value&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; // 2. only when value is the same - sort by key&nbsp; &nbsp; &nbsp; &nbsp; return vec[i].key < vec[j].key&nbsp; &nbsp; })&nbsp; &nbsp; fmt.Printf("%v", vec)}func mapToSlice(in map[string]int) []KV {&nbsp; &nbsp; vec := make([]KV, len(in))&nbsp; &nbsp; i := 0&nbsp; &nbsp; for k, v := range in {&nbsp; &nbsp; &nbsp; &nbsp; vec[i].key = k&nbsp; &nbsp; &nbsp; &nbsp; vec[i].value = v&nbsp; &nbsp; &nbsp; &nbsp; i++&nbsp; &nbsp; }&nbsp; &nbsp; return vec}type KV struct {&nbsp; &nbsp; key&nbsp; &nbsp;string&nbsp; &nbsp; value int}印刷:[{banana 3} {abb 2} {america 2} {test 2} {car 1}]现场演示
打开App,查看更多内容
随时随地看视频慕课网APP