英文:
golang defining dict like python with and appending value to list in dict
问题
我是你的中文翻译助手,以下是翻译好的内容:
我刚开始学习Go语言,尝试实现类似Python的嵌套结构,如下所示。我无法在Go中定义一个可以包含特定结构/类对象列表的空字典/映射,并且在遍历数据时无法向字典/映射中添加项目...非常感谢任何帮助...谢谢
items := []struct {
item string
obj someObj
}{
{"item1", someObj1},
{"item2", someObj2},
{"item3", someObj3},
{"item3", someObj5},
{"item1", someObj4},
}
rectors := make(map[string][]someObj)
for _, item := range items {
if _, ok := rectors[item.item]; ok {
rectors[item.item] = append(rectors[item.item], item.obj)
} else {
rectors[item.item] = []someObj{item.obj}
}
}
fmt.Println(rectors)
// 输出: map[item2:[someObj2] item3:[someObj3 someObj5] item1:[someObj1 someObj4]]
以上是将Python代码转换为Go代码的结果,实现了类似的功能。希望对你有帮助!
英文:
I am new to go and trying to implement python like nested structure as below, I am not able to define the empty dict/map in golang that can have list of specific struct/classobj and while iterating through the data I am not able to append items in map/dict ... I will really appreciate any help on this ... Thanks
items = [
("item1", someObj1),
("item2", someObj2),
("item3", someObj3),
("item3", someObj5),
("item1", someObj4),
]
rectors = {}
for item, obj in items:
try:
rectors[item].append(obj)
except KeyError:
rectors[item] = [obj]
print rectors
# OUTPUT: {'item2': [someObj2], 'item3': [someObj3, someObj5], 'item1': [someObj1, someObj4]}
答案1
得分: 2
这不是非常干净的代码,但它大致实现了你想要的,并且应该能帮助你朝正确的方向前进:
type someObj struct {
}
func main() {
items := map[string][]someObj{
"item1": []someObj{someObj{}},
"item2": []someObj{someObj{}},
"item3": []someObj{someObj{}},
}
items["item1"] = append(items["item1"], someObj{})
rectors := make(map[string][]someObj)
for key, val := range items {
if obj, exists := rectors[key]; exists {
rectors[key] = append(obj, val...)
} else {
rectors[key] = val
}
}
fmt.Printf("%v", rectors)
}
输出结果:
map[item3:[{}] item1:[{} {}] item2:[{}]]
主要的区别在于,你不能在初始化映射时同时修改已存在键的项(就像你在示例中对item1
进行追加一样)。因此,在映射初始化之后,需要进行额外的步骤。你可以直接这样做:
"item1": []someObj{someObj{}, someObj{}},
但这似乎与你的操作不同。
英文:
Its not quite as clean .. but this does roughly what you want and should get you started on the right path:
type someObj struct {
}
func main() {
items := map[string][]someObj{
"item1": []someObj{someObj{}},
"item2": []someObj{someObj{}},
"item3": []someObj{someObj{}},
}
items["item1"] = append(items["item1"], someObj{})
rectors := make(map[string][]someObj)
for key, val := range items {
if obj, exists := rectors[key]; exists {
rectors[key] = append(obj, val...)
} else {
rectors[key] = val
}
}
fmt.Printf("%v", rectors)
}
Output:
map[item3:[{}] item1:[{} {}] item2:[{}]]
The main difference being .. you can't initialize the map and alter an item with a key that already exists (as you appear to be doing in your example with item1
being appended during initialization). So that becomes an extra step after the initialization of the map. You could always just do:
"item1": []someObj{someObj{}, someObj{}},
.. but that didn't seem to be the same as what you were doing.
<kbd>See it on the Go playground</kbd>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论