Python3完全新手小白的学习手册 6 字典

字典可存储的信息量几乎不受限制,因此我们会演示如何遍历字典中的数据。
还将学习如何存储字典的列表、列表的字典和字典的字典。

一个简单的字典

一个外星人游戏,一个简单的字典,包含外星人的颜色和分数。

# 字典alien_0存储了这个外星人的颜色和分数
alien_0 = {'color': 'green', 'points': 5}
# 下面两行代码分别打印这个外星人的颜色和分数
print(alien_0['color'])
print(alien_0['points'])

输出:

green
5

使用字典

字典是一系列键值对。每个键都与一个值相关联,你可以使用键来访问与之相关联的值。
值可以是数字、字符串、列表乃至字典。事实上,可将任何Python对象用作字典中的值。

在Python中,字典用放在
花括号{}
中的一系列键值对表示,如前面的示例所示。

键值对是两个相关联的值。指定键时,Python将返回与之相关联的值。键和值之间用冒号分隔,而键值对之间用逗号分隔
在字典中,想存储多少个键值对都可以。

访问字典中的值

要获取与键关联的值,可指定字典名并把键放在后面的方括号内。


alien_0 = {'color': 'green'}
print(alien_0['color'])

输出:

green

添加键值对

字典是一种动态结构,可随时在其中添加键值对。

要添加键值对,可依次指定字典名、用方括号括起的键和相关联的值。

alien_0 = {'color': 'green', 'points': 5}

# 然后打印这个字典,以显示其信息快照。
print(alien_0)
# 在这个字典中新增一个键值对,其中的键为 'x_position'、值为 0。
alien_0['x_position'] = 0
# 重复同样的操作,但使用的键为 'y_position'、值为 25。
alien_0['y_position'] = 25
# 再次打印这个字典,以显示其信息快照。
print(alien_0)

输出:

{'color': 'green', 'points': 5}
{'color': 'green', 'points': 5, 'x_position': 0, 'y_position': 25}  

这个字典的最终版本包含 4 个键值对,其中原来的两个指定外星人的颜色和分数,而新增的两个指定其位置。

创建一个空字典开始

有时候,在空字典中添加键值对是为了方便,而不是为了创建字典。
例如,你可能会根据用户的操作来修改字典。
要创建空字典,可使用一对空花括号。

alien_0 = {}    # 创建一个空字典
alien_0['color'] = 'green'     # 新增一个键值对
alien_0['points'] = 5     # 新增一个键值对
print(alien_0)

输出:

{'color': 'green', 'points': 5}

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

修改字典中的值

要修改字典中的值,可依次指定字典名、用方括号括起的键以及与该键相关联的新值。

# 首先定义一个表示外星人 alien_0 的字典,其中只包含这个外星人的颜色。
alien_0 = {'color': 'green'}
print(f"The alien is {alien_0['color']}.")

# 接下来,将与键 'color' 关联的值改为 'yellow'。
alien_0['color'] = 'yellow'
print(f"The alien is now {alien_0['color']}.")

输出:

The alien is green.
The alien is now yellow.

删除键值对

对于字典中不再需要的信息,可使用 del 语句将相应的键值对彻底删除。
使用 del 语句时,必须指定字典名和要删除的键。

# 首先定义一个表示外星人 alien_0 的字典,其中包含这个外星人的颜色、点数和速度。
alien_0 = {'color': 'green', 'points': 5}
print(alien_0)
# 接下来,删除键 'points' 及其值。
del alien_0['points']
print(alien_0)

输出:

{'color': 'green', 'points': 5}
{'color': 'green'}

由类似对象组成的字典

字典存储的是一个对象(游戏中的一个外星人)的多种信息,但也可以使用字典来存储众多对象的同一种信息。

# 假设你要调查很多人,询问他们喜欢的编程语言,可使用一个字典来存储这种简单调查的结果

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

在最后一个键值对后面也加上逗号,为以后添加键值对做好准备。

从字典中获取任何人喜欢的语言。

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

language = favorite_languages['sarah'].title()
print(f"Sarah favorite language is {language}.")

输出:

Sarah favorite language is C.

使用 get() 来访问值

在访问字典中的值时,可依次指定字典名和放在方括号内的键。
这将返回与指定键相关联的值。

alien_0 = {'color': 'green', 'speed': 'slow'}
print(alien_0['points'])

输出:

Traceback (most recent call last):
  File "D:\Python_Project\Python_Project\Python3完全新手小白的学习手册\4 操作列表.py", line 10, in <module>
    print(alien_0['points'])
KeyError: 'points'

如果指定的键不存在,将返回一个错误。
为避免这种错误,有两种方法。

  • 通过在字典中调用 get() 并向其传递要获取的值所对应的键,这将返回指定的值。
  • 如果指定的键不存在,方法 get() 将返回指定的值(这里是 None)。
alien_0 = {'color': 'green','speed':'slow'}

# get() 方法的第一个参数用于指定键,是必不可少的;第二个参数为当指定的键不存在时要返回的值,是可选的
point_value = alien_0.get('points', 'No point value assigned.')
print(point_value)

输出:

No point value assigned.

遍历字典

遍历方式:既可遍历字典的所有键值对,也可只遍历键或值。

遍历所有的键值对

# 它用于存储有关网站用户的信息。这个字典存储一个用户的用户名、名和姓:

user_0 = {
    'username': 'efermi',
    'first': 'enrico',
    'last': 'fermi',
    }

for key, value in user_0.items():
    print(f"\nKey: {key}")
    print(f"Value: {value}")

输出:

Key: username   
Value: efermi

Key: first
Value: enrico

Key: last
Value: fermi

方法 items() 返回一个键值对列表。

由于该字典中的键都是人名,值都是语言,因此在循环中使用变量 name 和 language,而不是 key 和 value。这让人更容易明白循环的作用。

遍历字典中的所有键

在不需要使用字典中的值时,keys() 方法很有用。

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

for name in favorite_languages.keys():
    print(name.title())

输出:

Jen
Sarah
Edward
Phil

方法 keys() 并非只能用于遍历;实际上,它返回一个列表,其中包含字典中的所有键。

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

# 首先创建一个列表,其中包含要收到打印消息的朋友。
friends = ['phil', 'sarah']
# 在循环中,打印每个人的名字,并检查当前的名字是否在列表 friends 中
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 Python!

按特定顺序遍历字典中的所有键

要以特定的顺序返回元素,一种办法是在 for 循环中对返回的键进行排序。为此,可使用函数 sorted() 来获得按特定顺序排列的键列表的副本。

favorite_languages = {
    'jen': 'python',
   'sarah': 'c',
    'edward': 'rust',
    'phil': 'python',
    }
    
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.

这条 for 语句类似于其他 for 语句,但对方法 dictionary.keys() 的结果调用了 sorted() 函数。这让 Python 获取字典中的所有键,并在遍历前对这个列表进行排序。

遍历字典中的所有值

如果你感兴趣的是字典包含的值,可使用 values() 方法。它会返回一个值列表。

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

print("The following languages have been mentioned:")

for language in favorite_languages.values():
    print(language.title())

输出:

The following languages have been mentioned:
Python
C
Rust
Python

这条 for 语句提取字典中的每个值,并将它们依次赋给变量 language。通过打印这些值,就获得了一个包含被调查者选择的各种语言的列表

这种做法提取字典中所有的值,而没有考虑值是否有重复。
为剔除重复项,可使用集合(set)。集合类似于列表,但每个元素都必须是独一无二的。

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

print("The following languages have been mentioned:")
# 通过将包含重复元素的列表传入 set(),可让 Python 找出列表中独一无二的元素并使用这些元素来创建一个集合。
for language in set(favorite_languages.values()):
    print(language.title())

输出:

The following languages have been mentioned:
Python
C
Rust

注意:可以使用一对花括号直接创建集合,并在其中用逗号分隔元素


>>> languages = {'python', 'rust', 'python', 'c'}
>>> languages
{'rust', 'python', 'c'}

嵌套

有时候,需要将多个字典存储在列表中或将列表作为值存储在字典中,这称为嵌套。

字典列表

字典 alien_0 包含一个外星人的各种信息,但无法存储第二个外星人的信息,更别说屏幕上全部外星人的信息了。

一种办法是创建一个外星人列表,其中每个外星人都是一个字典,包含有关该外星人的各种信息。

# 首先创建三个字典,其中每个字典都表示一个外星人。
alien_0 = {'color': 'green', 'points': 5}
alien_1 = {'color': 'yellow', 'points': 10}
alien_2 = {'color': 'red', 'points': 15}

# 这些字典都存储到一个名为 aliens 的列表中。
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} 

外星人不止三个,而且每个外星人都是用代码自动生成的。

# 创建一个用于存储外星人的空列表。
aliens = []
# 创建 30 个绿色的外星人。
for alien_number in range(30):
    new_alien = {'color': 'green', 'points': 5, 'speed': 'slow'}
    aliens.append(new_alien)
    
# 显示前 5 个外星人。
or alien in aliens[:5]:
    print(alien)
print("...")

# 显示创建了多少个外星人。
print(f"Total number of aliens: {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

这些外星人都具有相同的特征,但在 Python 看来,每个外星人都是独立的,这让我们能够独立地修改每个外星人。

随着游戏的进行,有些外星人会变色且加快移动速度。在必要时,可使用 for 循环和 if 语句来修改某些外形人的颜色。例如,要将前三个外星人修改为黄色、速度中等且值 10 分,可这样做:

# 创建一个用于存储外星人的空列表。
aliens = []
# 创建 30 个绿色的外星人。
for alien_number in range(30):
    new_alien = {'color': 'green', 'points': 5,'speed':'slow'}
    aliens.append(new_alien)

for alien in aliens[:3]:
    if alien['color'] == 'green':
        alien['color'] = 'yellow'
        alien['speed'] = 'medium'
        alien['points'] = 10
# 显示前 5 个外星人。
for alien in aliens[:5]:
    print(alien)
print("...")

输出:

{'color': 'yellow', 'points': 10, 'speed': 'medium'}
{'color': 'yellow', 'points': 10, 'speed': 'medium'}
{'color': 'yellow', 'points': 10, 'speed': 'medium'}
{'color': 'green', 'points': 5,'speed':'slow'}
{'color': 'green', 'points': 5,'speed':'slow'}
...

可进一步扩展这个循环,在其中添加一个 elif 代码块,将黄色外星人改为移动速度快且值 15 分的红色外星人

# 创建一个用于存储外星人的空列表。
aliens = []
# 创建 30 个绿色的外星人。
for alien_number in range(30):
    new_alien = {'color': 'green', 'points': 5,'speed':'slow'}
    aliens.append(new_alien)

# 以上内容都一样
for alien in aliens[:3]:
    if alien['color'] == 'green':
        alien['color'] = 'yellow'
        alien['speed'] ='medium'
        alien['points'] = 10
    elif alien['color'] == 'yellow':
        alien['color'] = 'red'
        alien['speed'] ='fast'
        alien['points'] = 15
# 以下内容都一样

在字典中存储列表

有时候,需要将列表存储在字典中,而不是将字典存储在列表中。

如何描述顾客点的比萨呢?如果使用列表,只能存储要添加的比萨配料;但如果使用字典,其中的配料列表就只是用来描述比萨的一个方面。

# 存储顾客所点比萨的信息
pizza = {
    'crust': 'thick',
    'toppings': ['mushrooms', 'extra cheese'],
}

# 概述顾客点的比萨
print(f"You ordered a {pizza['crust']}-crust pizza "
      # 当函数调用 print() 中的字符串很长,需要分成多行书写时,可以在合适的位置分行,在每行末尾都加上引号,并且对于除第一行外的其他各行,都在行首加上引号并缩进。
      "with the following toppings:")

# 为了打印配料,编写一个 for 循环。为了访问配料列表,使用键 'toppings',这样 Python 将从字典中提取配料列表。
for topping in pizza['toppings']:
    print(f"\t{topping}")

输出:

You ordered a thick-crust pizza with the following toppings:
        mushrooms
        extra cheese

在这个示例中,对于指定的比萨,可使用一个键来存储其外皮类型,再使用一个键来存储配料列表。

在字典中储存字典

可以在字典中嵌套字典,但这样可能会让代码很快变得非常复杂。

# 首先定义一个名为 users 的字典,其中包含两个键:用户名 'aeinstein' 和 'mcurie',其中包含用户的名、姓和居住地。
users = {
    'aeinstein': {
        'first': 'albert',
        'last': 'einstein',
        'location': 'princeton',
    },

    'mcurie': {
        'first': 'marie',
        'last': 'curie',
        'location': 'paris',
    },
}

# 遍历字典 users 中的每个键值对,其中 username 是键,user_info 是值。
for username, user_info in users.items():
    print(f"\nUsername: {username}")
    # 开始访问内部的字典,变量 user_info 包含用户信息字典。
    # 然后,使用 user_info['first'] 和 user_info['last'] 来访问用户的名和姓,并将它们存储在变量 full_name 中。
    full_name = f"{user_info['first']} {user_info['last']}"
    # 同样,使用 user_info['location'] 来访问用户的居住地,并将其存储在变量 location 中。
    location = user_info['location']

# 对于每个用户,都使用这些键来生成整洁的姓名和居住地,然后打印有关用户的简要信息
print(f"\tFull name: {full_name.title()}")
print(f"\tLocation: {location.title()}")

输出:

Username: aeinstein
        Full name: Albert Einstein
        Location: Princeton
        
Username: mcurie
        Full name: Marie Curie
        Location: Paris

请注意,表示每个用户的字典都有相同的结构,虽然 Python 并没有这样的要求,但这使得嵌套的字典处理起来更容易。倘若表示每个用户的字典都包含不同的键,for 循环内部的代码将更复杂。


往期


代码仓库

代码仓库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qyydeep

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值