键值对(map、dict等)简单操作,多种语言实现(Python、Kotlin、C++、Golang)

一 目的

在编写程序时,本人使用第二多的数据结构是键值对,通过唯一的key来索引一个可以更加“精密”数据结构。总结来说,在我的产品中,应用较多的两个场景分别是:

  • 通过key-value返回context,例如使用django、spring boot等框架编写后端;
  • 存储大量的结构化信息,通过唯一的key索引,快速访问。
    各种编程语言都有实现key-value数据结构,现在介绍如下。

二 创建key-value

创建空的key-values,可在后续的代码逻辑中插入数据。一般用于读取外部的数据。
Python实现:

#coding=utf8

from __future__ import print_function, division
from typing  import Dict

d1 = {} # type: Dict[unicode, int] # 创建一个空的字典,key类型为unicode,value为int。

kotlin实现:

    val m = mapOf<String, Int>() // 空不可变空map,因为没有初始化值,所以用处不大。
    val mm = mutableMapOf<String, Int>() //可增删改查的mutable map,初始化为空。

Golang实现

    var m = make(map[string]int) // 创建空的map,size为0。
        //或者
        m := map[string]int{}

C++实现:

map<string, int> m;

创建带有初始化列表的key-values。一般用于后端向前端返回context或者简单的demo。
Python实现:

d2 = {u'甲': 1, u'乙':2} # type: Dict[unicode, int] # 创建带有初始化键值对的字典

Kotlin实现:

    val m2 = mapOf("甲" to 1, "乙" to 2) //值初始化之后,不可增删改查。
    val mm2 = mutableMapOf("甲" to 1, "乙" to 2) // 值初始化之后,后续可根据情况增删改查。

Golang实现:

    var m2 = map[string]int{
        "甲": 1,
        "乙": 2,
    }

C++实现:

    map<string, int> m2 = { // cpp11
        {"甲", 1},
        {"乙", 2}
    };

三 插入新的key-value值

Python实现:


keys = [u'丙', u'丁']
for k in keys:
    d2[k] = 3 # 插入新值,如果存在则覆盖,如果不存在则创建

Kotlin实现

    val keys = listOf("丙", "丁")
    for (key in keys) { // 依次插入一个
        mm2[key] = 3
    }
    // 或者依次插入全部的pairs
    mm2.putAll(listOf(Pair("丙",3 ), Pair("丁", 4)))

Golang实现

    var keys = []string{"丙", "丁"}
    for i := range keys {
        m2[keys[i]] = 3 // 如果不存在key,则会闯进新的key,否则会将之前的value覆盖。
    }

C++实现:

    vector<string> keys{"丙", "丁"};
    for(auto key : keys) {
        m2[key] = 3; // 如果存在key,则覆盖之前的值,否则创建新的key,插入value。
    }
    // 或者
    m2.insert(make_pair("戊", 5)); // 如果不存在key,则创建新的key,插入value,否则什么也不做。

四 删除key-value

Python代码,删除指定key:

del d2[u'甲']
# 或者
a = d2.pop(u'乙') # a为key对应的value。

如果不存在,则会抛出KeyError异常。

Kotlin代码,删除指定key:

    mm2.remove("甲") // 删除key,如果key不存在,则什么也不影响。

Golang代码,删除指定key:

    delete(m2, "丙") //如果key不存在什么都不做

C++代码,删除指定的key:

m2.erase("甲"); //如果key不存在什么都不做

Python代码,清空所有:

d2.clear()

Kotlin代码,清空所有:

    mm2.clear()

Golang代码,清空所有:

    for k := range m2 {
        delete(m2, k)
    }
        // 或者
      m2 = make([string]int) // 垃圾回收会清除之前的所有数据。

C++代码,清空所有:

    m2.clear();

五 赋值

Python代码:

d2[u'戊'] = 5 # 如果存在key则会更新其值,不存在则创建新的,并赋值。

Kotlin代码:

mm2[u'戊'] = 5 # 如果存在key则会更新其值,不存在则创建新的,并赋值。

Golang代码:

m2["戊"] = 5 // 如果存在key则会更新其值,不存在则创建新的,并赋值。

C++代码:

m2["戊"] = 3; // 如果存在key,则覆盖之前的值,否则创建新的key,插入value。
// 或者
m2.insert(make_pair("戊", 5)); // 如果不存在key,则创建新的key,插入value,否则什么也不做。

六 访问

Python代码:

v = d2[u'甲'] # 如果key不存在,则会抛出KeyError异常。

Kotlin代码:

    val v = mm2["甲"] // 如果key存在,则返回对应的value,否则返回null。

Golang

    var v = m2["乙"] // 如果key存在,则返回对应的value,否则返回类型的默认值

C++代码:

m2["甲"] // 如果key存在,则返回对应的value,否则返回类型的默认值

七 判断是否存在key

Python代码:

d2.has_key(u'甲')
#或者
if u'甲' in d2:
    print(d2[u'甲'])
if u'甲' not in d2:
    d2[u'甲'] = 1

Kotlin代码:

    mm2.contains("甲") //是否存在key
    mm2.containsKey("甲") // 是否存在key
    mm2.containsValue(1) // 是否存在value

Golang代码:

  i, ok := m2["甲"]
  _, ok := m2["甲"] // ok==true, 存在,否则不存在

C++代码:

    map<string, int>::iterator fiter = m2.find("加");
    if(fiter != m2.end()) {
        cout <<"find it!" << endl;
    } else {
        cout << "find not!"<< endl;
    }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容