go——字典(二)

字典是一种数据结构,用于存储一系列无序的键值对。

字典是基于键来存储值。字典功能强大的地方是能够基于键快速检索数据。

键就像索引一样,指向与键关联的值。

1.内部实现

字典是一个集合,可以使用类似处理数组和切片的方式迭代字典中的元素。

但字典是无序的集合,意味着没有办法预测键值对被返回的顺序。

即使使用同样的顺序保存键值对,每次迭代字典的时候顺序也可能不一样。

无序的原因是字典使用了散列表。

字典的散列表包含一组桶。在存储、删除或者查找键值对的时候,所有操作都要先选择一个桶。

把操作字典时指定的键传给字典的散列函数,就能选中对应的桶。

这个散列函数的目的是生成一个索引,这个索引最终将键值对分布到所有可用的桶里。

随着字典存储的增加,索引分布越均匀,访问键值对的速度就越快。

如果你在字典里存储了10000个元素,你不希望每次查找都要访问10000个键值对才能找到需要的元素,你希望查找键值对的次数越少越好。

对于有10000个元素的字典,每次查找都只需要查找8个键值对才是一个分布得比较好得字典。

字典通过合理数量的桶来平衡键值对得分布。

键会转化为一个数值(散列值)。这个数值落在字典已有桶的序号范围内表示一个可用于存储的桶的序号。

之后这个数值就被用于选择桶,用于存储或者查找指定的键值对。

对Go语言的字典来说,生成的散列键的一部分,具体来说是低位(LOB)被用来选择桶。

字典使用两个数据结构来存储数据。第一个数据结构是一个数组,内部存储的是用于选择桶的散列键的高八位值,

这个数值就被用于选择桶,用于存储或者查找指定的键值对。

第二个数据结构是一个字节数组,用于存储键值对。该字节数组先依次存储了这个桶里所有的键,之后依次存储了这个桶里所有的值。

实现这种键值对的存储方式目的在于减少每个桶所需的内存。

 

2.创建和初始化

 (1)使用make声明字典

Go语言中有很多中方法可以创建并初始化字典,可以使用内置的make函数,也可以使用字典字面量。

//创建一个字典,键的类型是string,值得类型是int
dict := make(map[string]int)

//创建一个字典,键和值得类型都是string
//使用两个键值对初始化字典
dict := map[string]string{"name":"kebi", "sex":"boy"}

(2)使用字典字面量声明空字典

创建字典时更常用得方法是使用字典字面量。字典的初始长度会根据初始化时指定得键值对的数量来确定。

字典的键可以是任何值。这个值的类型可以是内置的类型,也可以是结构类型,只要这个值可以使用==运算符做比较。

切片、函数以及包含切片的结构类型这些类型由于具有引用语义,不能作为字典的键,使用这些键会造成编译错误。

dict := map[[]string]string{}  //invalid map key type []string

(3)声明一个存储字符串切片的字典

没有任何理由阻止用户使用切片作为字典的值。

//创建一个字典,使用字符串切片作为值。
dict := map[int][]string{}

  

3.使用字典

 (1)为字典赋值

键值对赋值给字典,是通过指定适当类型的键并给这个件赋予一个值来完成的。

//创建一个空字典,用来存储颜色以及颜色对应的十六进制代码
colors := map[string]string{}

//将Red的代码加入到字典
colors["Red"] = "#da1337"

(2)对nil字典赋值时的语言运行时错误

可通过声明一个未初始化的字典来创建一个值为nil的字典。

nil字典不能用于存储键值对,否则,会产生一个语言运行错误

//通过声明字典创建一个nil字典
var colors map[string]string  


//将red的代码加入到字典
colors["red"] = "#da1337"  //assignment to entry in nil map

(3)从字典获取值并判断键是否存在

测试字典里是否存在某个键是字典的一个重要操作。

这样操作允许用户写一些逻辑来确定是否完成某个操作或者是否在字典里缓存了一个特定数据。

这样操作也可以用来比较两个字典,来确定那个键值对互相匹配,那些键值对不匹配。

从字典取值时有两个选择。第一个选择是,可以同时获得值,以及一个表示这个键是否存在的标志。

//获取键blue对应的值
value, exists := colors["blue"]

//这个键存在吗?
if exists {
    fmt.PrintLn(value)  
}

(4)从字典获取值,并通过该值判断键是否存在

另一个选择是,只返回键对应的值,然后判断这个值是不是零值来确定键是否存在。

//获取键Blue对应得值
value := colors["blue"]

//这个键存在吗?
if value != " " {
    fmt.PrintLn(value)
} 

在Go语言里,通过键来索引字典时,即便这个键不存在也总会返回一个值。

在这种情况下,返回得是该值对应得类型的零值。

(5)使用range迭代字典

迭代字典里的所有值和迭代数组或切片一样,使用关键字range。

对字典来说,range返回的不是索引的值,而是键值对。

package main

import "fmt"

func main() {
	//创建一个字典,存储颜色以及颜色对应的十六进制代码
	colors := map[string]string{
		"red":    "#34567",
		"blue":   "#6789",
		"pink":   "#drtuft",
		"yellow": "#df67",
	}
	//显式所有颜色
	for key, value := range colors {
		fmt.Printf("Key: %s, value: %s\n", key, value)
	}
}

/*
结果
Key: red, value: #34567
Key: blue, value: #6789
Key: pink, value: #drtuft
Key: yellow, value: #df67
*/

(6)从字典中删除一项

如果想要把一个键值从字典里删除,就使用内置的delete函数。

//删除键为red的键值对
delete(colors, "red)

  

4.在函数间传递字典

在函数键传递字典并不会制造出该字典的一个副本。

实际上,当传递一个字典给一个函数,并对这个函数做出修改时,所有对这个字典的引用都会察觉到这个修改。

package main

import "fmt"

func recoveColor(colors map[string]string, key string) {
	delete(colors, key)
}

func main() {
	//创建一个字典,存储颜色以及颜色对应的十六进制代码
	colors := map[string]string{
		"red":    "#34567",
		"blue":   "#6789",
		"pink":   "#drtuft",
		"yellow": "#df67",
	}
	//显式所有颜色
	for key, value := range colors {
		fmt.Printf("Key: %s, value: %s\n", key, value)
	}

	//调用函数移除指定的键
	recoveColor(colors, "red")

	//显式所有颜色
	fmt.Println(" ")
	for key, value := range colors {
		fmt.Printf("Key: %s, value: %s\n", key, value)
	}
}
/*
直接修改原字典
Key: red, value: #34567
Key: blue, value: #6789
Key: pink, value: #drtuft
Key: yellow, value: #df67
 
Key: yellow, value: #df67
Key: blue, value: #6789
Key: pink, value: #drtuft
*/

  

 

转载于:https://www.cnblogs.com/yangmingxianshen/p/10090236.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,下面是回复: Python计算思维训练——字典和字符串()是一篇关于Python编程语言中字典和字符串的进阶应用的文章。在这篇文章中,读者将学习如何使用Python中的字典和字符串来解决更加复杂的问题。文章中包含了许多实用的示例和练习,可以帮助读者更好地理解和掌握Python中字典和字符串的使用方法。如果你正在学习Python编程语言,那么这篇文章一定会对你有所帮助。 ### 回答2: Python 计算思维是指借助 Python 编程语言来进行计算思维训练,掌握一系列 Python 基础概念和编程技巧,提高计算思维能力的一种训练方式。其中,字典和字符串是 Python 中比较重要的两个数据类型之一,也是 Python 计算思维训练中必须掌握的内容。 一、字典 字典是 Python 中一种非常常用的数据类型,也是 Python 中唯一的映射类型。字典以键-值(key-value)对的形式存储数据,可以通过键快速查找与获取值。字典的定义方式是用 {} 包含键-值对,用 : 将键和值分隔开,多个键-值对之间用 , 分隔。例如: a = {'name': 'Alice', 'age': 20, 'gender': 'female'} print(a['name']) # 输出:Alice 字典中也可以包含嵌套字典,即字典的值也可以是字典。例如: b = {'name': 'Bob', 'contacts': {'phone': '123456', 'email': 'bob@example.com'}} print(b['contacts']['email']) # 输出:bob@example.com 字典的常用操作包括访问键-值对、添加键-值对、删除键-值对、修改键-值对等。例如: a = {'name': 'Alice', 'age': 20, 'gender': 'female'} print(a.keys()) # 输出:dict_keys(['name', 'age', 'gender']) print(a.values()) # 输出:dict_values(['Alice', 20, 'female']) a['school'] = 'Tsinghua University' print(a) # 输出:{'name': 'Alice', 'age': 20, 'gender': 'female', 'school': 'Tsinghua University'} del a['age'] print(a) # 输出:{'name': 'Alice', 'gender': 'female', 'school': 'Tsinghua University'} a['name'] = 'Carol' print(a) # 输出:{'name': 'Carol', 'gender': 'female', 'school': 'Tsinghua University'} 、字符串 字符串是 Python 中的一个基础数据类型,通常用来表示文本或字符序列。字符串可以用单引号 '' 或双引号 "" 包含,也可以用三引号 ''' 或 """ 包含多行字符串。例如: a = 'Hello, world!' b = "I'm Alice." c = '''Hello, world!''' print(a, b, c, sep='\n') # 输出:Hello, world! # I'm Alice. # Hello, # world! 字符串的常用操作包括字符串拼接、字符串切片、字符串格式化等。例如: a = 'Hello, ' b = 'world!' print(a + b) # 输出:Hello, world! print(a * 3) # 输出:Hello, Hello, Hello, c = 'Tom is a boy.' print(c[4:9]) # 输出:is a d = 'My name is {0}, I am {1} years old.'.format('Alice', 20) print(d) # 输出:My name is Alice, I am 20 years old. 综上所述,字典和字符串是 Python 中重要的数据类型,掌握了它们的使用方法和常用操作,可以更好地进行 Python 计算思维训练,提高编程能力和学习效率。 ### 回答3: Python计算思维训练是一系列的Python编程基础课程,着重训练学生的计算思维能力。在第课,我们学习了字典和字符串。 首先,让我们简要介绍字典字典是Python中非常重要的数据类型,它允许我们存储键值对。每个键必须唯一,并且可以使用不同类型的键(例如,字符串、整数和浮点数)。字典是一种无序的数据结构,意味着字典中的元素没有顺序。在Python中,可以使用花括号来创建字典,如: {'键1': '值1', '键2': '值2' }。 接下来,让我们深入了解Python中字符串的处理。字符串是Python中的一种基本数据类型,表示一系列的字符。在Python中,字符串可以通过单引号、双引号或三引号来声明。字符串也可以包含数字、字母和符号。可以对字符串进行许多不同的操作,如连接、分割、修剪等。我们还可以使用Python字符串函数来完成各种各样的操作,如查找、替换和格式化等。 学习了字典和字符串后,我们可以更高效地完成各种编程任务。例如,在字典中存储信息,可以使我们更快速地索引和查找数据;使用字符串函数可以使我们更轻松地处理文本。此外,Python中的许多库和模块也使用字典和字符串来处理数据和文本。 总之,学习Python中的字典和字符串是编程学习的重要一步。它们为我们提供了强大的工具集,可以帮助我们更轻松地处理各种编程任务,从而提高我们的编程能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值