本章内容来自书籍,记录下来仅方便复习,如有侵权,请联系作者删除。

一、一个简单的字典

下面是一个简单的字典,存储了外星人的颜色和点数的信息。

alien_0 = {'color':'red','points':5}
print(alien_0['color'])
print(alien_0['points'])

运行结果
red
5

二、使用字典

在Python中,字典是一系列键-值对。每一个键都有一个值相关联,可以使用键来访问与之关联的值。值可以包括数字、字符串、列表、字典等,任何Python对象都可以作为值保存在字典中。
在Python中,字典用放在花括号{}中的一系列键值对表示。

1. 访问字典中的值
访问规则:使用字典名[键],需要指定字典名,键,Python会返回相应的值。

alien_0 = {'color':'red','points':5}
point_data = alien_0['points']
print("You just earned "+str(point_data)+" points!")
运行结果:
You just earned 5 points!

2. 添加键-值对
添加规则:字典名[键]=值,需要指定字典名,键,传入值。
字典是一种动态结果,可随时在其中添加键-值对,可一次指定字典名,用方括号括起的键和想关联的值。
如下所示:给外星人添加x坐标,y坐标

alien_0 = {'color':'red','points':5}
print(alien_0)
alien_0['x_position'] = 3
alien_0['y_position'] = 5
print(alien_0)
运行结果
{'color': 'red', 'points': 5}
{'color': 'red', 'points': 5, 'x_position': 3, 'y_position': 5}

Python不关心键值对的顺序,只关心键和值之间的关联关系。

3. 先创建一个空字典
创建规则:可用一对空的花括号{}定义一个空字典

alien_0 = {}
alien_0['color'] = 'red'
alien_0['points'] = 5
print(alien_0)
运行结果:
{'color': 'red', 'points': 5}

使用字典来存储用户提供的数据或者编写能自动生成大量键-值对的代码时,通常需要先定义一个空字典。

4. 修改字典中的值
修改规则:字典名[键] = 新值

alien_0 = {'color':'red','points':5}
alien_0['color'] = 'green'
alien_0['points'] = alien_0['points'] + 3
print(alien_0)
运行结果
{'color': 'green', 'points': 8}

5. 删除键-值对
删除规则: del 字典名[键] 永久删除指定键
对于字典中不在需要的信息,可使用del语句将相应的键-值对彻底删除。使用del语句时,不许指定字典名和要删除的键。

alien_0 = {'color':'red','points':5}
del alien_0['points']
print(alien_0)
运行结果
{'color': 'red'}

6. 由类似对象组成的字典
字典可以存储一个对象的多种信息,也可以用来存储众多对象的同一种信息。

如下所示,很多人最喜欢的编程语言:

favorite_languages = {
    'jen':'python',
    'sarah':'c',
    'edward':'ruby',
    'phil':'java',
}

print("Sarah's favorite language is "+
    favorite_languages['sarah'].title()+
    "."
)
运行结果:
Sarah's favorite language is C.

(1)可以在最后一个键-值对后面也加上逗号,为以后再下一行添加键-值对做好准备
(2)print() 语句可分成多行,用拼接运算符(+)连接

三、遍历字典

遍历字典有多种方式,可遍历字典的所有键-值对

1. 遍历所有的键-值对
遍历方式:for循环+字典的方法items(),for k,v in 字典名.items() 第一部分,声明两个变量,用于存储键-值对中的键和值,可使用任何名称;
第二部分,包含字典名和items()方法,可返回一个键-值对列表。

for循环依次将每个键-值对存储到指定的两个变量中。遍历字典时,键-值对的返回顺序与存储顺序不同,Python不关心键-值对的存储顺序,只跟踪键和值之间的关联关系。

favorite_languages = {
    'jen':'python',
    'sarah':'c',
    'edward':'ruby',
    'phil':'java',
}

for name,language in favorite_languages.items():
    print(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.

在这里,for循环处的代码让Python遍历字典中的每个键-值对,并将键存储在name中,值存储在language中。

2. 遍历字典中的所有键
遍历方式:for循环+字典的方法keys(), for k in 字典名.keys() 第一部分,声明一个变量,用于存储键-值对中的键,可使用任何名称;
第二部分,包含字典名和keys()方法,可返回包含所有键的列表。遍历字典时,Python默认遍历所有的键,所以在这里方法keys()可以省略。

favorite_languages = {
    'jen':'python',
    'sarah':'c',
    'edward':'ruby',
    'phil':'java',
}

for name in favorite_languages.keys():
    print("Hello "+name.title()+", What's your favorite language?")

运行结果
Hello Jen, What's your favorite language?
Hello Sarah, What's your favorite language?
Hello Edward, What's your favorite language?
Hello Phil, What's your favorite language?

在这里,keys()可返回字典中的所有键,并依次将他们存储到变量name中。接下来省略方法keys(),也可以通过字典名[键]的方式访问字典中的值

favorite_languages = {
    'jen':'python',
    'sarah':'c',
    'edward':'ruby',
    'phil':'java',
}

for name in favorite_languages:
    print(name.title()+"'s favorite language is "+
        favorite_languages[name]+"."
    )
运行结果
Jen's favorite language is python.
Sarah's favorite language is c.
Edward's favorite language is ruby.
Phil's favorite language is java.

如下所示,字典的keys()方法返回一个列表,可以结合if语句,判断某个值是否包含在该列表中

favorite_languages = {
    'jen':'python',
    'sarah':'c',
    'edward':'ruby',
    'phil':'java',
}

if 'jen' not in favorite_languages.keys():
    print("Jen, please take our poil")
else:
    print("Jen, thank you for taking the poil")
    
if 'erin' not in favorite_languages.keys():
    print("Erin, please take our poil!")
else:
    print("Jen, thank you for taking the poil")
    
运行结果
Jen, thank you for taking the poil
Erin, please take our poil!

3. 按顺序遍历字典中的所有键
排序方式:使用函数sorted() 字典总是明确地记录键和值之间的关联关系,当获取字典的元素时,获取的顺序是不可预测的。如果想要特定的顺序返回元素,可在for循环中对返回的键进行排序,因此,可使用函数sorted()来获得按特定顺序排列的键列表副本。

favorite_languages = {
    'jen':'python',
    'sarah':'c',
    'edward':'ruby',
    'phil':'java',
}

for name in sorted(favorite_languages.keys()):
    print(name.title())
        
运行结果:
Edward
Jen
Phil
Sarah

4. 遍历字典中的所有值
遍历方式:for循环+字典的方法values(),for v in 字典名.values() 第一部分,声明一个变量,用于存储键-值对中的键,可使用任何名称;
第二部分,包含字典和values()方法,可返回包含所有值的列表。可调用集合(set)去除重复项。

favorite_languages = {
    'jen':'python',
    'sarah':'c',
    'edward':'ruby',
    'phil':'python',
}

for language in favorite_languages.values():
    print(language)
运行结果
python
c
ruby
python

按照上式,for语句提取字典中的每个字,并将他们依次存储到变量language中。这种做法提取字典中的所有值,不考虑是否重复。为了剔除重复项,可使用集合(set)。集合类似于列表,但集合中不能包含重复元素。

favorite_languages = {
    'jen':'python',
    'sarah':'c',
    'edward':'ruby',
    'phil':'python',
}

for language in set(favorite_languages.values()):
    print(language)
运行结果
c
python
ruby

按照上式,使用set()提取favorite_languages.values()中的不同语言,得到一个不重复的列表。

四、嵌套

有时候,需要将一系列的字典存储在列表中,或者将列表存储在字典中,这称为嵌套。可用于列表嵌套字典,字典嵌套列表,字典嵌套字典等。

1. 字典列表
目标:建立30外星人的信息,并将这些信息打印出来。
字典alien_0中包含了一个外星人的各种信息,但是无法存储其他外星人的信息,需要再次创建多个字典来存储其他外星人的信息,然后将这些字典都放在一个名为aliens的列表中。

#创建一个用于存储外星人的空列表
aliens = []

#创建30个绿色的外星人
for alien_numbers in range(30):
    new_alien = {'color':'green','points':5,'speed':'slow'}
    aliens.append(new_alien)

#显示前5个外形人
for alien in aliens[:5]:
    print(alien)
print('-'*10)
#查看外星人的数量
print("Total number of aliens:"+str(len(aliens)))

运行结果
{'color': 'green', 'points': 5, 'speed': 'slow'}
{'color': 'green', 'points': 5, 'speed': 'slow'}
{'color': 'green', 'points': 5, 'speed': 'slow'}
{'color': 'green', 'points': 5, 'speed': 'slow'}
{'color': 'green', 'points': 5, 'speed': 'slow'}
----------
Total number of aliens:30

每个外星人都是独立的,可以单独修改每个外星人的信息。创建好30个外星人后,需要把前三个外星人的颜色改为黄色,移动速度设置为‘medium’,点数设置为10,如下:

#创建一个用于存储外星人的空列表
aliens = []

#创建30个绿色的外星人
for alien_numbers in range(30):
    new_alien = {'color':'green','points':5,'speed':'slow'}
    aliens.append(new_alien)

#修改前3个外星人的信息
for alien in aliens[:3]:
    alien['color']='green'
    alien['speed']='medium'
    alien['points']=10

#显示前5个外外星人的信息
for alien in aliens[:5]:
    print(alien)
print('-'*10)
#查看外星人的数量
print("Total number of aliens:"+str(len(aliens)))

运行结果
{'color': 'green', 'points': 10, 'speed': 'medium'}
{'color': 'green', 'points': 10, 'speed': 'medium'}
{'color': 'green', 'points': 10, 'speed': 'medium'}
{'color': 'green', 'points': 5, 'speed': 'slow'}
{'color': 'green', 'points': 5, 'speed': 'slow'}
----------
Total number of aliens:30

2. 在字典中存储列表

当需要在字典中,将一个键关联到多个值时,都可以在字典中嵌套一个列表。如下所示,当一个人喜欢的语言有多个时,可以保存在一个列表中。

favorite_languages = {
    'jen':['python','ruby','haskell'],
    'sarah':'c',
    'edward':['ruby','go'],
    'phil':['python'],
}

for name,languages in favorite_languages.items():
    if len(languages)>1:
        print("\n"+name.title()+"'s favorite languages are:")
        for language in languages:
            print(language)
    else:
        print("\n"+name.title()+"'s favorite language is:")
        for language in languages:
            print(language)

运行结果
Jen's favorite languages are:
python
ruby
haskell

Sarah's favorite language is:
c

Edward's favorite languages are:
ruby
go

Phil's favorite language is:
python

注意:列表和字典的嵌套层级不应该太多

3. 在字典中存储字典

字典中嵌套字典,比较复杂。应该使得每个嵌套的字典的结构都相同,即每个字典都包含相同的键,让遍历过程相对简单。

例子:一个字典表示一个人,字典中保存人的姓名,居住地址。让这些人保存在一个更大的字典中。

users = {
    'tom':{
        'first':'tom',
        'last':'einstein',
        'location':'princeton',
    },
    'lisa':{
        'first':'lisa',
        'last':'stevn',
        'location':'beijing',
    }
}

for user_name,user_info in users.items():
    full_name = user_info['first']+' '+user_info['last']
    location = user_info['location']
    print("\n Username: "+user_name)
    print("\tFull name: "+full_name)
    print("\tLocation: "+location)
运行结果

 Username: tom
        Full name: tom einstein
        Location: princeton

 Username: lisa
        Full name: lisa stevn
        Location: beijing

五、小结

学习了如何定义字典,如何使用字典,如何访问和修改字典中的元素,遍历字典中的所有信息,嵌套列表,嵌套字典。