6.字典
6.1字典的使用
字典是一系列键值对,每个键都与一个值相关联,可以使用键来访问相关联的值。与键相关联的值可以是数、字符串、列表乃至字典。事实上,可以将任何python对象作为字典中的值。字典可存储的信息量几乎不受限制。字典用放在花括号{}中的一系列键值对表示。示例如下:
alien={'color':'green','points':5}
6.1.1访问字典中的值
要获取和访问字典中与键相关联的值,可依次指定字典名和放在方括号内的键。示例如下:
alien={'color':'green','points':5}
print(alien['color'])
print(alien['points'])
输出结果为:
green
5
同样,可以将字典中获取的值赋给变量并使用。示例如下:
alien = {'color':'green','points':5}
new_points = alien['points']
print(f'You just earned {new_points} points!')
输出结果为:
You just earned 5 points!
6.1.2添加键值对
字典是一种动态结构,可随时在其中添加键值对。要添加键值对,可依次指定字典名、用方括号括起来的键和相关联的值。示例如下:
alien = {'color':'green','points':5}
alien['x_position'] = 0
alien['y_position'] =25
print(alien)
输出结果为:
{'color': 'green', 'points': 5, 'x_position': 0, 'y_position': 25}
此时原本的字典中添加了值为0的’x_position’键和值为25的’y_position’键。
有时在空字典中田间键值对可能更为便利,因此也可以先创建一个空字典,再分行添加各个键值对。示例如下:
alien_1 = {}
alien_1['color'] = 'red'
alien_1['points'] = 10
print(alien_1)
输出结果为:
{'color': 'red', 'points': 10}
###6.1.3修改字典中的值
要修改字典中的值,可依次指定字典名、用方括号括起来的键,以及与该键相关联的新值。示例如下:
alien = {'color':'green','points':5}
alien['color'] = 'yellow'
print(alien)
输出结果为:
{'color': 'yellow', 'points': 5}
此时外星人的颜色已经变成了黄色。可结合if语句进行更为复杂的操作。示例如下:
#定义一个外星人,包含初始坐标和速度
alien = {'x_position':0,'y_position':25,'speed':'medium'}
#输出外星人的原始x坐标:
print(f"Original x_position:{alien['x_position']}")
#向右移动外星人,根据当前速度确定移动距离
if alien['speed'] == 'slow':
x_increment = 1
elif alien['speed'] == 'medium':
x_increment = 2
else:
x_increment =3
#新位置为旧位置加上移动距离
alien['x_position'] = alien['x_position'] + x_increment
#输出新位置
print(f"New x_position: {alien['x_position']}")
输出结果如下:
New x_position: 2
6.1.4删除键值对
对于字典中不需要的信息,可以使用del语句将相应的键值对彻底删除,使用时必须指定字典名和要删除的键。示例如下:
alien = {'color':'green','points':5}
del alien['points']
print(alien)
输出结果如下:
{'color': 'green'}
此时,原本的字典中只剩下颜色键值对。
6.1.5由类似对象组成的字典
在以上示例中,字典存储的是一个对象的多种信息,但其实也可以用字典来存储众多对象的同一种信息。确定需要使用字典来存储多对象的同一信息时,需要注意以下几点:
- 在输入左花括号后按回车键;
- 在下一行缩进四个空格;
- 指定第一个键值对后在它后面加上一个逗号;
- 在每个键值对后都加上一个逗号(最后一个也);
- 在最后一个键值对的下一行添加一个右花括号
示例如下:
favorite_languages = {
'jen':'python',
'sarah':'c',
'edward':'ruby',
'phil':'java',
}
给定键值对的键,可轻松获得相关联的值。示例如下:
favorite_languages = {
'jen':'python',
'sarah':'c',
'edward':'ruby',
'phil':'java',
}
language = favorite_languages['sarah'].title()
print(f"Sarah's favorite language is {language}.")
输出结果为:
Sarah's favorite language is C.
###6.1.6使用get()来访问值
使用放在方括号内的键从字典中获取值时,若指定的键不存在会进行报错。示例如下:
alien = {'color':'green','points':5}
print(alien['speed'])
输出结果为:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'speed'
为避免此类错误,可使用**get()**在指定的键不存在时返回一个默认值。使用方法为:dict.get(‘key’,‘value’),其中key表示需要指定的键,value表示当指定的键不存在时要返回的值,value可以为空,此时将返回“None”。示例如下:
alien = {'color':'green','points':5}
speed_value = alien.get('speed','No speed value assigned.')
print(speed_value)
speed_value = alien.get('speed')
print(speed_value)
输出结果为:
No speed value assigned.
None
6.2遍历字典
6.2.1遍历所有键值对
要遍历字典中所有的键值对,可使用for循环。使用方法为:
1.声明两个变量,用于存储键值对中的键和值。这两个变量可以使用任意名称,一般常用key来表示键,value来表示值;
2.第二部分包含字典名和方法item(),用以返回一个键值对列表;
3.使用这两个变量来打印每个键及相关联的值。
示例如下:
favorite_number = {
'faxxtty':5,
'miumiu':7,
'tingting':9,
'gege':2,
'pangpang':8,
}
for key,value in favorite_number.items():
print(f'\nKey:{key}')
print(f'Value:{value}')
输出结果如下:
Key:faxxtty
Value:5
Key:miumiu
Value:7
Key:tingting
Value:9
Key:gege
Value:2
Key:pangpang
Value:8
当字典中存储的是不同人的同一信息时,遍历所有的键值对就很合适。对于上面不同人喜欢的语言的示例,在循环中使用变量name和language使表达更明了。示例如下:
favorite_languages = {
'jen':'python',
'sarah':'c',
'edward':'ruby',
'phil':'java',
}
for name,language in favorite_languages.items():
print(f"{name.title()}'s favorite language is {language.title()}.")
输出结果如下:
Jen's favorite language is Python.
Sarah's favorite language is C.
Edward's favorite language is Ruby.
Phil's favorite language is Java.
6.2.2遍历所有键:方法key()
- 提取字典中所有的键。使用dict.keys() 示例如下:
favorite_languages = {
'jen':'python',
'sarah':'c',
'edward':'ruby',
'phil':'java',
}
for name in favorite_languages.keys():
print(name.title())
输出结果为:
Jen
Sarah
Edward
Phil
事实上,遍历字典时,会默认遍历所有的键,因此语法dict.keys()也可以被省略。示例如下:
favorite_languages = {
'jen':'python',
'sarah':'c',
'edward':'ruby',
'phil':'java',
}
for name in favorite_languages:
print(name.title())
此时输出结果依然如上。
- 在这种循环中,也可以使用当前键来访问与之相关的值。示例如下:
favorite_languages = {
'jen':'python',
'sarah':'c',
'edward':'ruby',
'phil':'java',
}
friends = ['phil','sarah']
for name in favorite_languages.keys():
print(f'Hi {name.title()}.')
if name in friends:
language = favorite_languages[name].title()
print(f'\t{name.title()}, I see you love {language}!')
输出结果如下:
Hi Jen.
Hi Sarah.
Sarah, I see you love C!
Hi Edward.
Hi Phil.
Phil, I see you love Java!
- 更甚,可以使用keys()来核实字典中不存在的键。示例如下:
favorite_languages = {
'jen':'python',
'sarah':'c',
'edward':'ruby',
'phil':'java',
}
if 'erin' not in favorite_languages.keys():
print('Eric,please take our poll.')
输出结果为:
Eric,please take our poll.
6.2.3按特定顺序遍历字典中的所有键
要以特定的顺序返回元素,可以在for循环中对返回的键进行排序。可使用函数sorted() 来获得按特定顺序排列的键列表的副本。示例如下:
favorite_languages = {
'jen':'python',
'sarah':'c',
'edward':'ruby',
'phil':'java',
}
for name in sorted(favorite_languages.keys()):
print(f'{name.title()},thank you for taking the poll.')
输出结果为:
Edward,thank you for taking the poll.
Jen,thank you for taking the poll.
Phil,thank you for taking the poll.
Sarah,thank you for taking the poll.
6.2.4遍历字典中所有的值
提取字典中所有的值。使用dict.values() 示例如下:
favorite_languages = {
'jen':'python',
'sarah':'c',
'edward':'ruby',
'phil':'python',
}
for language in favorite_languages.values():
print(language.title())
输出结果为:
Python
C
Ruby
Python
这种方法虽然提取字典中所有的值,但没有考虑值是否有重复。为剔除重复项,可使用集合(set) ,集合中每个元素要求是独一无二的。示例如下:
favorite_languages = {
'jen':'python',
'sarah':'c',
'edward':'ruby',
'phil':'python',
}
for language in set(favorite_languages.values()):
print(language.title())
此时输出结果变为:
Python
Ruby
C
事实上,可以使用一对花括号直接创建集合,并在其中用逗号分隔元素。 示例如下:
languages = {'python','ruby','python','c'}
languages
输出结果为:
{'python', 'ruby', 'c'}
注意:集合和字典非常容易混淆,当花括号内没有键值对时,定义很可能是集合 ,不同于列表和字典,集合不会以特定的顺序存储元素 。
6.3嵌套
将一系列字典存储在列表中,或者将列表作为值存储在字典内,即称为嵌套。可以在列表中嵌套字典、在字典中嵌套列表或者在字典中嵌套字典。
6.3.1在列表中存储字典
以下为创建一个列表中包含三个字典的示例:
alien_0 = {'color':'red','point':5}
alien_1 = {'color':'orange','point':7}
alien_2 = {'color':'yellow','point':9}
aliens = [alien_0,alien_1,alien_2]
for alien in aliens:
print(alien)
输出结果为:
{'color': 'red', 'point': 5}
{'color': 'orange', 'point': 7}
{'color': 'yellow', 'point': 9}
6.3.2在字典中存储列表
示例如下:
pizza = {
'crust':'thick',
'toppings':['mushrooms','extra cheese'],
}
print(f'You ordered a {pizza["crust"]}-crust pizza '
'with the following toppings:')
for topping in pizza['toppings']:
print('\t' + topping)
输出结果为:
You ordered a thick-crust pizza with the following toppings:
mushrooms
extra cheese
6.3.3在字典中存储字典
示例如下:
users = {
'aeintein':{
'first':'albert',
'last':'einstein',
'location':'princeton'
},
'mcurie':{
'first':'marie',
'last':'curie',
'location':'paris',
},
}
for username, user_info in users.items():
print(f'\nUsername:{username}')
full_name = f'{user_info["first"]}{user_info["last"]}'
location = user_info['location']
print(f'\tFull name:{full_name.title()}')
print(f'\tLocation:{location.title()}')
输出结果如下:
Username:aeintein
Full name:Alberteinstein
Location:Princeton
Username:mcurie
Full name:Mariecurie
Location:Paris