如何基于参数对对象列表进行分类

问题描述 投票:1回答:1

我有一个具有此定义的对象的列表:

type MyObject struct {
    ID        int `json:"id"`
    Level     int `json:"level"`
    CityID    int `json:"city_id"`
}

我想基于CityID对它们进行分类,以获得一个列表列表,其中每个内部列表的项目都具有相同的CityID

例如,如果我有以下列表:

[
    MyObject {ID: 1, Level: 12, CityID: 7},
    MyObject {ID: 2, Level: 15, CityID: 2},
    MyObject {ID: 3, Level: 55, CityID: 4},
    MyObject {ID: 4, Level: 88, CityID: 7},
    MyObject {ID: 5, Level: 11, CityID: 4},
    MyObject {ID: 6, Level: 5, CityID: 7},
    MyObject {ID: 7, Level: 42, CityID: 2}
]

我需要下面的输出:

[
    [MyObject {ID: 1, Level: 12, CityID: 7}, MyObject {ID: 4, Level: 88, CityID: 7}, MyObject {ID: 6, Level: 5, CityID: 7}],
    [MyObject {ID: 2, Level: 15, CityID: 2}, MyObject {ID: 7, Level: 42, CityID: 2}],
    [MyObject {ID: 3, Level: 55, CityID: 4}, MyObject {ID: 5, Level: 11, CityID: 4}]
]

我知道使用itertools在python中是可能的,但是我在go中是新手,对它的库了解很少。有帮助吗?

编辑1:

我当前正在使用此:

m := make(map[int][]MyObject)

for _, item := range myList {
    if val, ok := m[item.CityID]; ok {
        m[item.CityID] = append(val, item)
    } else {
        m[item.CityID] = []MyObject{item, }
    }
}
arrays dictionary go categories slice
1个回答
0
投票

您当前的方法是要走的路,但是可以简化,不需要检查CityID是否已在映射中,因为indexing映射中没有键的映射将得出值类型的zero value,对于切片而言为nil,并且可以毫无问题地追加到nil切片中:

m := make(map[int][]MyObject)

for _, item := range myList {
    m[item.CityID] = append(m[item.CityID], item)
}
© www.soinside.com 2019 - 2024. All rights reserved.