Dictionary 定义地图切片的地图地图,带有;转让给“无”;错误,是否动态预填充或生成关键点?
我是个新手,正在用它来处理数据 我有一个python程序,它将json输入作为dict列表的dict,如下所示:Dictionary 定义地图切片的地图地图,带有;转让给“无”;错误,是否动态预填充或生成关键点?,dictionary,go,Dictionary,Go,我是个新手,正在用它来处理数据 我有一个python程序,它将json输入作为dict列表的dict,如下所示: { "64": { "-117": [{ "lat": 64.1121952, "loc": "Northwest Territories", "lon": -117.3
{
"64": {
"-117": [{
"lat": 64.1121952,
"loc": "Northwest Territories",
"lon": -117.3539847,
"id": "GmtNT",
"name": "Gameti"
}],
"-147": [{
"lat": 64.838,
"loc": "Alaska",
"lon": -147.716,
"id": "FairbanksAK",
"name": "Fairbanks"
},
{
"lat": 64.9,
"loc": "Alaska",
"lon": -147.4,
"id": "IcFgObAK",
"name": "Icefog Observatory"
}]
},
"71": {
"-125": [{
"lat": 71.985123,
"loc": "Northwest Territories",
"lon": -125.2464831,
"id": "SchshrbrNT",
"name": "Sachs Harbour"
}]
}
}
我正在编写一个Go脚本来生成这个json作为输入。我已经有了一个可以将数据转换成这种格式的go脚本:
siteIDMap := make(map[string]map[string]string)
终端中的样本输出:
map[
CydrvrNU: map[loc:Nunavut lat:70.476365 lng:-68.6012651 name:Clyde River]
UkhktkNT: map[loc:Northwest Territories lat:70.7367504 lng:-117.7704441 name:Ulukhaktok]
PrdhByAK: map[loc:Alaska lat:70.254704 lng:-148.3406 name:Prudhoe Bay]
SchshrbrNT: map[loc:Northwest Territories lat:71.985123 lng:-125.2464831 name:Sachs Harbour]
]
然而,我在最后一步遇到了麻烦。我已经能够尝试并初始化我怀疑是正确的数据类型latLngMap:=make(map[string]map[string][]map[string]string)
,并尝试填充它,但显然不能不初始化每个lat/lng组合
到目前为止,我要做的代码如下:
//Already have 'siteIDMap' created in above code not shown
slice2 := []map[string]string{} //empty slice that can be added to
//Init map of Lat/Lng to site data
latLngMap := make(map[string]map[string][]map[string]string)
// for every site in map
for k, v := range siteIDMap {
loc := v["loc"]
lat := v["lat"]
lng := v["lng"]
name := v["name"]
m := map[string]string{"id": k, "lat": lat, "lng": lng, "loc": loc, "name": name}
latFloor := strings.Split(lat, ".")[0]
lngFloor := strings.Split(lng, ".")[0]
fmt.Println(m, latFloor, lngFloor)
latLngMap[latFloor][lngFloor] = append(slice2, m)
}
最后一行给出了错误panic:assignment to entry in nil map
,这很有意义,因为lat/lng值尚未作为键输入map中
但是对于像这样笨拙的东西,我该如何初始化它呢
我是否需要map[-89至+89]lat
,对于每个map[-89至+89]lng
,对于每个:[]map[string]string{}
如果我这样做,可能90%的lat/lon组合将完全为空。似乎是一种可怕的浪费
如何在生成此数据结构时创建它
我曾考虑过为这种大型嵌套数据类型创建一个结构,但我还是新手,不确定这是否有帮助。您可以根据需要初始化嵌套映射-您不必初始化所有可能的lat、lng对 问题是
make(map[string]map[string][]map[string]string)
正在初始化string
到map[string][]的映射,而不是string
到[]映射[string]string
的映射。因此,当您分配latLngMap[lat][lng]
时,[lat]
部分是正常的,但是[lng]
部分的映射没有初始化(它们是nil
)
因此,您只需在latLngMap[lat]
中初始化映射,然后再将任何内容放入其中。你可以在纬度上的for循环中这样做
//Already have 'siteIDMap' created in above code not shown
//Init map of Lat/Lng to site data
latLngMap := make(map[string]map[string][]map[string]string)
// for every site in map
for k, v := range siteIDMap {
loc := v["loc"]
lat := v["lat"]
lng := v["lng"]
name := v["name"]
// initialize nested map for this lat if it was not already initialized
// by a previous iteration
_, ok := latLngMap[lat]
if !ok {
latLngMap[lat] = make(map[string][]map[string]string)
latLngMap[lat][lng] = make([]map[string]string, 1)
}
m := map[string]string{"id": k, "lat": lat, "lng": lng, "loc": loc, "name": name}
latFloor := strings.Split(lat, ".")[0]
lngFloor := strings.Split(lng, ".")[0]
fmt.Println(m, latFloor, lngFloor)
latLngMap[latFloor][lngFloor] = append(latLngMap[latFloor][lngFloor], m)
}
请注意,我还更改了创建嵌套贴图内部切片的位置。如果两个地方的lat、lng相同,这将防止出现错误。以前,如果有两个,第一个将被第二个覆盖
这是运行在中的代码的简化版本。进行了一次小的编辑(应该使用LatFloor作为键,而不是Lat),但除此之外,这是完美的。谢谢