为了账号安全,请及时绑定邮箱和手机立即绑定

嵌套字典 Golang 问题

嵌套字典 Golang 问题

Go
泛舟湖上清波郎朗 2021-11-29 19:35:59
我在下面第 167 行部分开始时遇到问题的区域:for scanner.Scan() {        //dateCollection := make(map[string]int)        m := tag.FindString(scanner.Text())        if m != "" {            // stop races            Lock.Lock()            arr := strings.Split(m, "/")            taghash := strings.Join(arr, "_")            taghash = strings.TrimLeft(taghash, "_")            //data[taghash]++            m = date.FindString(scanner.Text())            if m != "" {                hour := m                data[taghash] = make(map[string]int)                data[taghash][hour]++            }            Lock.Unlock()        }    }    fmt.Println(file)    os.Remove(file)    if err := scanner.Err(); err != nil {        log.Fatal(err)    }我在主函数中打印值时得到的输出fstvt1_ros_300x600_pp8_1 T07 1我期待一个看起来像这样的输出:fstvt1_ros_300x600_pp8_1T00 213434T01 23432T02 3324T03 324T04 324T05 0 ...(this isn't real data)我想要做的是: 我有一个数据映射,var data = make(map[string]map[string]int)其键等于 taghash,例如fstvt1_ros_300x600_pp8_1. 该值是数据映射。该映射的键值应为字符串和整数。我想要多张地图。每个键一个... T01, T02 .. 当前输出的是我正在迭代的最后一个项目中的最后一个项目,而不是每个标签哈希的键和值的集合。我如何制作,而不是覆盖数据,而是添加新的键值 T01、T02 .. 并且如果 taghash 和小时是增加该特定对象的一些。我目前使用的代码行:T01, T02..data[taghash][hour]++如果 taghash 和小时存在,那么它应该增加。如果 taghash 和 hour 不存在,则创建 taghash 并添加新键和增量。
查看完整描述

1 回答

?
慕哥6287543

TA贡献1831条经验 获得超10个赞

错误来自


data[taghash] = make(map[string]int)

data[taghash]每次通过时,这都会设置为新分配的地图。这绝对不是你想要做的。反而:


if _, ok := data[taghash]; !ok {

    // data[taghash] does not exist -- create it!

    data[taghash] := make(map[string]int)

}

data[taghash][hour]++

这相当于:


# Python

data.setdefault(taghash, {}).setdefault(hour, 0) += 1

或者


if taghash not in data:

    data[taghash] = {}

if hour not in data[taghash]:

    data[taghash][hour] = 1

else:

    data[taghash][hour] += 1


查看完整回答
反对 回复 2021-11-29
  • 1 回答
  • 0 关注
  • 187 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信