字典(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',...}
直接定义
设计一个游戏,其中包含一些外星人,这些外星人的颜色和分数各不同,我们要存储这些信息就需要用到字典:
alien_0 = {'color':'green','points':5}
print(alien_0['color'])
print(alien_0['points'])
这样就可以初步的建立起了一个dict型结构,传入一个key
,其对应的value
就被打印出来:
green
5
定义后添加
和列表相同,字典也可以在定义后添加key
-value
来达到构建字典的目的:
#部分定义
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)
{'color': 'green', 'points': 5, 'x_position': 0, 'y_position': 25}
2. 修改字典中的value
#更改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)
#更改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
:
#遍历所有的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)
#遍历所有的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
的作用:
favourite_bikes = {
'hank':'santa cruz',
'jack':'giant',
'tim':'specialized',
'phill':'giant',
'edward':'specialized'}
for value in set(favourite_bikes.values()):
print(value)
specialized
giant
santa cruz
可见,无论一个value
在list或dict中重复多少次,在转化为set
后都有且只有一个
4. 字典的嵌套
a. 字典列表
如果一个项目存在多个类似的字典,而又需要统一管理它们,比如在攻击外星人这种游戏中关于外星人的设定,我们可以用一个总体列表来表示外星人这一群体:
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)
{'color': 'green', 'points': 5}
{'color': 'yellow', 'points': 10}
{'color': 'red', 'points': 15}
可见,我们仅用一个列表就将所有字典包含起来了,这要操作就方便很多
实际上,我们可能需要自动生成更多外星人,引入range()
可以解决这个问题并且可以用条件语句和切片来对字典的value
进行修改:
aliens = []
for alien_number in range(30):
new_alien = {'color':'green','points':5}
aliens.append(new_alien)
#第四个外星人后属性改变
for alien in aliens[4:8]:
if alien['color'] == 'green':
alien['color'] = 'yellow'
alien['points'] = 10
#第八个外星人后属性改变
for alien in aliens[8:]:
if alien['color'] == 'green':
alien['color'] = 'red'
alien['points'] = 15
#显示修改后的情况
for alien in aliens[:10]:
print(alien)
{'color': 'green', 'points': 5}
{'color': 'green', 'points': 5}
{'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': 'red', 'points': 15}
{'color': 'red', 'points': 15}
显然,通过综合运用各种方式,我们的目的达到了
b. 字典中嵌套列表
如果同一个key
对应多个value
,比如,加在披萨中的配料可能不止一种,怎么办?这个时候就需要在字典中嵌套列表来实现:
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)
You ordered a thick-crust pizzawith the following toppings:
mushrooms
extra cheese
c. 在字典中嵌套字典
比如我们需要用爬虫爬取一个网站,但是要用不止一个以上的用户名登录,这个时候就可以用字典嵌套字典:
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'] + '.')
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其实用爬虫填表单的时候正是用的字典来完成。