python学习笔记(六)字典
1、字典初见
python中的字典实际上就是一系列的“键-值”对(key-value),它们之间时无序的,每一个键都必须有与之对应的值,这个值可以是任意python对象(数字、字符串、列表、字典等)。基本格式如下:
example = { #注意是使用花括号
'key_0': value_0, #键与其对应值用冒号链接,键一般是字符串
'key_1': value_1, #采用逗号分隔
'key_2': value_2
} #键-值对的数量是任意的,但是必须相互对应
下面我想用通俗一点的语言来阐述一下我本人对字典的理解。首先我认为字典是列表的升级版,它只是为列表中的值附上了一个现实意义,每一个字典变量实际上是一个鲜明的个体,字典的键就是这个个体的属性,而键的对应值则是这个个体针对该属性具备的特有值。键与个体所属的种类有关,而值则与个体本身的特性有关,用于区分相同种类的不同个体,看下面的例子。
#这里创建两个学生,每个学生都有自己的学号、姓名、性别作为属性,但是不同的学生这三个属性的值不会全部相同(这里只是举个例子,两个不同的字典的键-值对是可以完全相同的)
student_0 = {
'id': '01',
'name': 'Jack',
'gender': 'male',
'age': 18
}
student_1 = {
'id': '02',
'name': 'Marry',
'gender': 'female',
'age': 17
}
重申,以上的例子只是为了方便大家理解字典,实际上这个例子是十分特殊的,大家在创建字典时一定要视情况而定。
2、访问字典的值
想要得到字典中特定键的对应值,只需要提供字典名和键即可,这里可以类比列表,只不过索引变成了键名。
student_0 = {
'id': '01',
'name': 'Jack',
'gender': 'male',
'age': 18
}
student_0_name = student_0['name']
student_0_age = student_0['age']
print(student_0_name + " is " + str(student_0_age) + " years old.") #这里帮大家回忆一下数字和字符串的拼接
运行结果为:
Jack is 18 years old.
3、添加键-值对
字典与列表相同,都是一个动态的结构,这意味着我们可以根据需要随时增删字典中的键-值对。先来看添加键-值对,需要提供字典名、键名和其对应值。
student_0 = {
'id': '01',
'name': 'Jack',
'gender': 'male',
'age': 18
}
print(student_0)
student_0['x_position'] = 1
student_0['y_position'] = 1
print(student_0)
运行结果为:
{'id': '01', 'name': 'Jack', 'gender': 'male', 'age': 18}
{'id': '01', 'name': 'Jack', 'gender': 'male', 'age': 18, 'x_position': 1, 'y_position': 1}
键-值对的排列顺序与添加顺序不一定相同,原因我在开头提过——字典中的键-值对是无序的。
注意:添加键-值对的操作对于“先创建一个空字典,再根据情况逐步完善字典”尤为重要(有时候是不得不这样做的,比如for循环批量创建字典)。
4、修改字典中的值
格式与添加键-值对类似,需要提供字典名、键名和其对应新值。
student_0 = {
'id': '01',
'name': 'Jack',
'gender': 'male',
'age': 18
}
print(student_0)
student_0['gender'] = 'female'
print(student_0)
运行结果为:
{'id': '01', 'name': 'Jack', 'gender': 'male', 'age': 18}
{'id': '01', 'name': 'Jack', 'gender': 'female', 'age': 18}
修改字典中的值是一个十分重要的操作,它使得我们的对象能够“活过来”,具有生命。这句话,你品,你细品!这里的例子我也保留,上一篇提到过后面想用python写一个小游戏,到时候应该有机会。
5、删除键-值对
del语句为我们提供永久删除键-值对的功能。需要提供字典名和键名,这样该字典中的目标键及其对应值就可以被永久性删除。
student_0 = {
'id': '01',
'name': 'Jack',
'gender': 'male',
'age': 18
}
print(student_0)
del student_0['gender']
print(student_0)
运行结果为:
{'id': '01', 'name': 'Jack', 'gender': 'male', 'age': 18}
{'id': '01', 'name': 'Jack', 'age': 18}
6、字典的另一种用法
在之前举的例子中我都是用字典存储同一个对象(学生)的多种信息(学号、姓名、性别、年龄等),实际上,字典也可以用来存储多个对象的同种信息。
favorite_language = {
'Jack': 'python',
'Marry': 'c',
'John': 'java',
'Max': 'ruby'
}
7、遍历字典
遍历字典分为三种:
A 遍历字典的键-值对
B 遍历字典的键
C 遍历字典的值
下面我们一个一个来看。
A 遍历字典的键-值对
当我们提到遍历时,首先想到的应该就是之前讲过的for循环。我们先看基本格式格式:
example = {
'key_0': value_0,
'key_1': value_1,
'key_2': value_2
}
for key, value in example.items():
do something
首先我们注意到,由于键-值对是一对量,所以我们需要两个变量来进行存储(这里的key和value是两个变量名,也可以根据需要选取其他的)。其次,要想遍历字典,必须调用 .item() 函数,因为这个函数可以为我们返回一个键-值对列表。
favorite_language = {
'Jack': 'python',
'Marry': 'c',
'John': 'java',
'Max': 'ruby'
}
print(favorite_language.items())
运行结果为:
dict_items([('Jack', 'python'), ('Marry', 'c'), ('John', 'java'), ('Max', 'ruby')])
下面看遍历的例子:
favorite_language = {
'Jack': 'python',
'Marry': 'c',
'John': 'java',
'Max': 'ruby'
}
for name, language in favorite_language.items():
print(name + " likes " + language + " best!")
print("Over!")
运行结果为:
Jack likes python best!
Marry likes c best!
John likes java best!
Max likes ruby best!
Over!
B 遍历字典的键
在遍历键时,我们需要一个新的函数—— .keys()
favorite_language = {
'Jack': 'python',
'Marry': 'c',
'John': 'java',
'Max': 'ruby'
}
print(favorite_language.keys())
相信大家明白它和 .items() 函数的区别在哪里,运行结果为:
dict_keys(['Jack', 'Marry', 'John', 'Max'])
下面看遍历的例子:
favorite_language = {
'Jack': 'python',
'Marry': 'c',
'John': 'java',
'Max': 'ruby'
}
for name in favorite_language.keys():
print(name)
print("Over!")
运行结果为:
Jack
Marry
John
Max
Over!
通常情况下我们选择使用 .keys() 是因为它可以返回键的列表,这方便我们进行其他的操作,实际上,也可以直接这样做:
favorite_language = {
'Jack': 'python',
'Marry': 'c',
'John': 'java',
'Max': 'ruby'
}
for name in favorite_language:
print(name)
print("Over!")
虽然省略了 .keys() 函数,但是结果是一样的。个人并不建议省略,因为我觉得这样显示的表达会更方便理解。
这里我还想介绍一个 sorted() 函数,这个函数可以将 .key() 函数返回的键列表按字典序排序(因为键-值对是无序的),有时候,这个操作很有必要。
favorite_language = {
'Jack': 'python',
'Marry': 'c',
'John': 'java',
'Max': 'ruby'
}
for name in sorted(favorite_language.keys()):
print(name)
print("Over!")
运行结果为:
Jack
John
Marry
Max
Over!
C 遍历字典的值
不用说,我相信大家已经猜到了这个函数—— .values(),返回值列表。
favorite_language = {
'Jack': 'python',
'Marry': 'c',
'John': 'java',
'Max': 'ruby'
}
print(favorite_language.values())
运行结果为:
dict_values(['python', 'c', 'java', 'ruby'])
——————————————————————————————
这里我想讲一个很有用的函数——set(),去重函数。看一个例子:
favorite_language = {
'Jack': 'python',
'Marry': 'c',
'John': 'java',
'Max': 'ruby',
'Mike': 'python'
}
print(favorite_language.values())
print(set(favorite_language.values()))
运行结果为:
dict_values(['python', 'c', 'java', 'ruby', 'python'])
{'c', 'python', 'ruby', 'java'}
注意这里的运行结果,是提取出列表中的元素,生成一个不含重复元素的集合。
————————————————————————————————
下面看遍历的例子:
favorite_language = {
'Jack': 'python',
'Marry': 'c',
'John': 'java',
'Max': 'ruby',
'Mike': 'python'
}
for language in favorite_language.values():
print(language)
print("Over!")
运行结果为:
python
c
java
ruby
python
Over!
同时,这里的 .value() 函数与 .keys() 不同,是不可省略的。否则:
favorite_language = {
'Jack': 'python',
'Marry': 'c',
'John': 'java',
'Max': 'ruby',
'Mike': 'python'
}
for language in favorite_language:
print(language)
print("Over!")
运行结果为:
Jack
Marry
John
Max
Mike
Over!
相信大家已经明白了省略的含义。
8、嵌套
在这里我还想简单的提一下嵌套的概念,实际上就是列表和字典的组合。通常情况下有三种(这里简单的举一些例子,具体的使用还需要大家根据情况自行判断):
A 字典列表
student_0 = {
'id': '01',
'name': 'Jack',
'gender': 'male',
'age': 18
}
student_1 = {
'id': '02',
'name': 'Marry',
'gender': 'female',
'age': 17
}
student_2 = {
'id': '03',
'name': 'John',
'gender': 'male',
'age': 19
}
students = [student_0, student_1, student_2]
for student in students:
print(student)
运行结果为:
{'id': '01', 'name': 'Jack', 'gender': 'male', 'age': 18}
{'id': '02', 'name': 'Marry', 'gender': 'female', 'age': 17}
{'id': '03', 'name': 'John', 'gender': 'male', 'age': 19}
字典列表是为了方便管理同种类字典。
B 在字典中存储列表
favorite_languages = {
'Jack': ['python', 'c++'],
'Marry': ['c'],
'John': ['java', 'c'],
'Max': ['ruby', 'java']
}
字典中存储列表是因为有时候一个键不止对应一个值。
C 在字典中存储字典
students = {
'Jack': {
'id': '01',
'gender': 'male',
'age': 18
},
'Marry': {
'id': '02',
'gender': 'female',
'age': 17
},
'John': {
'id': '03',
'gender': 'male',
'age': 19
}
}
for student_name, student_info in students.items():
print(student_name + "'s information:")
print(student_info)
print()
print("Over!")
运行结果为:
Jack's information:
{'id': '01', 'gender': 'male', 'age': 18}
Marry's information:
{'id': '02', 'gender': 'female', 'age': 17}
John's information:
{'id': '03', 'gender': 'male', 'age': 19}
Over!
这样做同样也可以方便管理,但是代码会变得十分复杂,事实上,在初学阶段,一般不怎么需要用到嵌套,等到熟练之后,自然而然地就会根据需要自行引入嵌套了。