字典类型(map)

本文详细介绍了编程语言中字典(map)的数据结构,包括其特点(如快速查找),声明、初始化方法,以及常用的长度、容量操作、添加、修改、删除和查看键值对的方法。同时讨论了嵌套字典的使用和注意事项,强调了键必须可哈希且不能重复的要求。

概要

在学习任何的编程语言,一般都会一种数据类型称为:字典(map)或映射(map),以键值对为元素的数据集合,例如:

{
	"age":"18",
	"name":"mashiro"
	"e-mail":"mashiro@outlook.com"
}

这种类型最大的特点就是查找速度非常快,因为他的底层存储就是基于哈希表存储的(不同语言还会有一些差异)。
以 取模+拉链法来快速了解下哈希表存储原理,如下图请添加图片描述
这种结果之所以块,是因为根据key可以直接找到数据存放的位置;而其他的数据类型是需要从前到后去逐一比对,相对来说比较耗时
以上只是基本的存储类型,而各个编程语言中的字典都会在此基础上进行相应的修改和优化(想了解更多的可以看一下GO中map底层实现机制)
Map的特点:

  • 键不能重复
  • 键必须可以哈希(目前我们已学的数据类型中,可哈希的有 :int/bool/float/string/array)
  • 无序
    接下来 关于map,可以从两个维度来进行讲解:
  • 常见使用
  • 底层原理剖析

声明&初始化

// userinfo := map[string]string{}
userInfo := map[string]string{"name":"mashiro","age":"18"}
1
userInfo["name"] //mashiro
userInfo["age"] = "20"
userInfo["email"] = "mashiro@outlook.com"
// data := make(map[int]int , 10)
data := make(map[int]int)
data["100"] = 998
data["200"] = 999

//声明,nil
var row map[string]int
row = data
data := make(map[string]int)
data["100"] := 998
data["200"] := 999

//声明,nil
value := new(map[string]int)
//value["k1"] = 123 #报错
value = &data

注意:键不重复&键必须可哈希(int/bool/float/string/array)

v1 := make(map[[2]int]float32)
v1[[2]int{1,1}] = 1.5
v1[[2]int{1,2}] = 3.4

v2 := make(map[[2]int][3]string )
v2[[2]int{1,1}] = [3]string{"mashiro","shina","0w0"}

常用操作

长度和容量

data := map[string]string{"n1":"mashiro","n2":"shina"}
value := len(data) //2
//根据参数值(10),计算出合适的容量
//一个map中会包含很多桶,每个桶可以存放8个键值对。
info := make(map[string]string,10)

info["n1"] = "mashiro"
info["n2"] = "shina"

v1 := len(info) //2
//v2 := cap(info) //报错

添加

data :=map[string]string{"n1":"mashiro","n2":"shina"}
data["n3"] = "0w0"

修改

data := map[string]string{"n1":"mashiro","n2":"shina"}
data["n1"] = "0w0"

删除

data := map[string]string{"n1":"mashiro","n2":"shina"}
delete(data,"n2")

查看

data := map[string]string{"n1":"mashiro","n2":"shina"}
data["n1"]
data := map[string]string{"n1":"mashiro","n2":"shina"}
for key,value := range data{
    fmt.Println(key,value)
}
data := map[string]string{"n1":"mashiro","n2":"shina"}
for key := range data{
	fmt.Println(key)
}
data := map[string]string{"n1":"mashiro","n2":"shina"}
for _, value := range data {
	fmt.Println(value)
}

嵌套

v1 := make(map[string]int)
v2 := make(map[string]string)
v3 := make(map[string...])
v4 := make(map[string][2]int)
v5 := make(map[string][]int)
v6 := make(map[string]map[int]int)
v7 := make(map[string][2]map[string]string)
v7["n1"] = [2]map[string]string{ map[string]string{"name":"mashiro","age":"18"},map[string]string{"name":"shina","age":"19"}}
v7["n2"] = [2]map[string]string{
map[string]string{"name":"0w0","age":"20"},map[string]string{"name":"0o0","age":"21"}}

//伪代码
v7 = {
	n1:[
		{"name":"mashiro","age":"18"}
		{"name":"shina","age","19"}
	],
	n2:[
		{"name":"0w0","age":"20"}
		{"name":"0o0","age":"21"}
	]
}

前提:键不重复 &键必须可哈希

v8 := make(map[int]int)
v8 := make(map[string]int)
v10 := make(map[float32]int)
v11 := make(map[bool]int)
v12 := make(map[ [2]int ]int)
v13 := make(map[ []int ]int)//错误,不可哈希
v14 := make(map[ map[int]int ]int)//错误,不可哈希
v15 := make(map[ [2][]int ]int)//报错
v16 := make(map[ [2]map[string]string ]int)//报错

变量赋值

v1 := map[string]string{"n1":"mashiro","n2":"shina"}
v2 := v1

v1["n1"] = "MASHIRO"

ftm.Println(v1) // {"n1":"MAHSIRO","n2":"shina"}
ftm.Println(v2) // {"n1":"MASHIRO","n2":"shina"}```



在Python中,你可以通过以下步骤编写这样的程序: 1. 首先,创建一个空字典 `map1` 来存储单词及其出现的次数。 ```python map1 = {} ``` 2. 使用循环遍历每一行用户输入的英文句子。可以使用 `split()` 函数将句子拆分成单词列表,然后逐词处理。 ```python while True: sentence = input("请输入英文句子(按回车结束):") if not sentence.strip(): break # 结束输入 words = sentence.split() for word in words: # 检查单词是否已经在字典中 if word in map1: map1[word] += 1 else: map1[word] = 1 ``` 3. 转换字典为列表,以便于排序。这里可以使用 `collections.Counter` 对象,它内部就是字典并能方便地统计元素数量,然后使用 `items()` 获取元组列表,其中包含键值对 `(word, count)`。 ```python from collections import Counter word_counts = list(map1.items()) ``` 4. 排序列表,可以根据单词出现的次数降序排列。这里我们可以使用 `sorted()` 函数,传入一个自定义的关键字函数 `lambda x: x[1]` 来指定按照第二个元素(计数值)进行排序。 ```python sorted_word_counts = sorted(word_counts, key=lambda x: x[1], reverse=True) ``` 5. 最后,打印出原始的字典内容以及排序后的结果。 ```python print("原始字典内容:", map1) print("排序后的结果:", sorted_word_counts) ``` 如果你想要继续运行这个程序,只需删除已经过时的部分(如 `map1` 的初始化),并在适当的地方插入上述代码。记得在实际应用中添加错误处理,比如检查用户输入是否为英文等。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值