字典(dict)型数据结构

字典(dict)型数据结构

在C语言中,结构体可以将变量与变量之间相关联地储存起来,Python中也有与之类似的一种结构,叫做字典(dict),它能将键key与值value一一对应然后储存起来。 ## 1.字典的建立 前面学过的总结一下: 列表list = ['element_1','element_2',...] 元组tuple = ('element_1','element_2',...) 字典的表示方式为:dict = {'key_1':'value_1','key_2':'value_2',...} ### 直接定义 设计一个游戏,其中包含一些外星人,这些外星人的颜色和分数各不同,我们要存储这些信息就需要用到字典:

1
2
3
4
alien_0 = {'color':'green','points':5}

print(alien_0['color'])
print(alien_0['points'])
这样就可以初步的建立起了一个dict型结构,传入一个key,其对应的value就被打印出来:
1
2
green
5
### 定义后添加 和列表相同,字典也可以在定义后添加key-value来达到构建字典的目的:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#部分定义
alien_0 = {'color':'green','points':5}

alien_0['x_position'] = 0
alien_0['y_position'] = 25
print(alien_0)

#空定义
alien_0 = {}

alien_0['color'] = 'green'
alien_0['points'] = 5
alien_0['x_position'] = 0
alien_0['y_position'] = 25
print(alien_0)
1
{'color': 'green', 'points': 5, 'x_position': 0, 'y_position': 25}
## 2. 修改字典中的value
1
2
3
4
5
6
7
8
9
10
11
12
#更改dict中的value
alien_0 = {'color':'green'}
print('The alien is ' + alien_0['color'] + '.')

alien_0['color'] = 'yellow'
print('The alien is ' + alien_0['color'] + '.')
#利用del语句删除key-value
alien_0 = {'color':'green','points':5}
print(alien_0)

del alien_0['points']
print(alien_0)
1
2
3
4
5
6
#更改dict中的value
The alien is green.
The alien is yellow.
#利用del语句删除key-value
{'color': 'green', 'points': 5}
{'color': 'green'}
注意:删除了的key-value永远消失,操作是不可逆的 ## 3. 遍历字典 由于字典是由一个或者无数个key-value构成的,因此在遍历的时候要首先确定需要遍历的是什么,是key-value还是key,或者只是value
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#遍历所有的key-value -> dict.items()
user = {
'username':'hank.gan@foxmail.com',
'passport':'123456',
'verification code':'SC9D'}
for key,value in user.items(): #此处的key、value可以是任何变量名
print('\nkey: ' + key)
print('value: ' +value)

#遍历所有的key -> dict.keys()
user = {
'username':'hank.gan@foxmail.com',
'passport':'123456',
'verification code':'SC9D'}
for key in user.keys():
print('key: ' + key)

#遍历所有的value -> dict.values()
user = {
'username':'hank.gan@foxmail.com',
'passport':'123456',
'verification code':'SC9D'}
for value in user.values():
print('value: ' +value)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#遍历所有的key-value -> dict.items()

key: username
value: hank.gan@foxmail.com

key: passport
value: 123456

key: verification code
value: SC9D

#遍历所有的key -> dict.keys()
key: username
key: passport
key: verification code

#遍历所有的value -> dict.values()
value: hank.gan@foxmail.com
value: 123456
value: SC9D
### 集合set 此处需要补充一下集合的内容。和它的名字一样,集合set具有数学中集合类似的意义:set中的元素不能有重复。set是用来存放key的,因此可以得出key也是一个唯一且不重复的值,那么如果定义了两遍同一个key会怎么样呢?详见上述修改字典的value 下面一个简单的例子来说明set的作用:
1
2
3
4
5
6
7
8
favourite_bikes = {
'hank':'santa cruz',
'jack':'giant',
'tim':'specialized',
'phill':'giant',
'edward':'specialized'}
for value in set(favourite_bikes.values()):
print(value)
1
2
3
specialized
giant
santa cruz
可见,无论一个value在list或dict中重复多少次,在转化为set后都有且只有一个 ## 4. 字典的嵌套 ### a. 字典列表 如果一个项目存在多个类似的字典,而又需要统一管理它们,比如在攻击外星人这种游戏中关于外星人的设定,我们可以用一个总体列表来表示外星人这一群体:
1
2
3
4
5
6
7
8
alien_0 = {'color':'green','points':5}
alien_1 = {'color':'yellow','points':10}
alien_2 = {'color':'red','points':15}

aliens = [alien_0,alien_1,alien_2]

for alien in aliens:
print(alien)
1
2
3
{'color': 'green', 'points': 5}
{'color': 'yellow', 'points': 10}
{'color': 'red', 'points': 15}
可见,我们仅用一个列表就将所有字典包含起来了,这要操作就方便很多 实际上,我们可能需要自动生成更多外星人,引入range()可以解决这个问题并且可以用条件语句和切片来对字典的value进行修改:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
aliens = []

for alien_number in range(30):
new_alien = {'color':'green','points':5}
aliens.append(new_alien)

#第四个外星人后属性改变
for alien in aliens[3:8]:
if alien['color'] == 'green':
alien['color'] = 'yellow'
alien['points'] = 10
#第八个外星人后属性改变
for alien in aliens[7:]:
if alien['color'] == 'green':
alien['color'] = 'red'
alien['points'] = 15
#显示修改后的情况
for alien in aliens[:10]:
print(alien)
1
2
3
4
5
6
7
8
9
{'color': 'green', 'points': 5}
{'color': 'green', 'points': 5}
{'color': 'yellow', 'points': 10}
{'color': 'yellow', 'points': 10}
{'color': 'yellow', 'points': 10}
{'color': 'yellow', 'points': 10}
{'color': 'yellow', 'points': 10}
{'color': 'red', 'points': 15}
{'color': 'red', 'points': 15}
显然,通过综合运用各种方式,我们的目的达到了 ### b. 字典中嵌套列表 如果同一个key对应多个value,比如,加在披萨中的配料可能不止一种,怎么办?这个时候就需要在字典中嵌套列表来实现:
1
2
3
4
5
6
pizza = {
'crust':'thick',
'toppings':['mushrooms','extra cheese']}
print('You ordered a ' +pizza['crust'] + '-crust pizza' + 'with the following toppings:')
for topping in pizza['toppings']:
print('\t' + topping)
1
2
3
You ordered a thick-crust pizzawith the following toppings: 
mushrooms
extra cheese
### c. 在字典中嵌套字典 比如我们需要用爬虫爬取一个网站,但是要用不止一个以上的用户名登录,这个时候就可以用字典嵌套字典:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
users = {
'hank':{
'username':'hank.gan@foxmail.com',
'passport':'123456',
'verification code':'SC9D'
},
'tim':{
'username':'tim.cook@foxmail.com',
'passport':'654321',
'verification code':'BVR3'
}
}

for user,user_info in users.items():
print('Hello, ' + user.title() +' Your email is ' + user_info['username'] + '.And your passport is ' + user_info['passport'] + '.Please fill the verification code: ' + user_info['verification code'] + '.')
1
2
Hello, Hank Your email is hank.gan@foxmail.com.And your passport is 123456.Please fill the verification code: SC9D.
Hello, Tim Your email is tim.cook@foxmail.com.And your passport is 654321.Please fill the verification code: BVR3.
有内味了蛤hhhhh其实用爬虫的时候填表单正是用的字典来完成。

作者

Hank.Gan

发布于

2020-02-18

更新于

2021-08-05

许可协议

评论