键值对(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;
    }
原文地址:https://www.cnblogs.com/ledao/p/15085580.html