python学习笔记(四)

这篇博客详细介绍了Python中的字典数据结构,包括字典的创建、访问和修改值、添加键值对、遍历字典以及字典的嵌套。作者通过实例展示了如何在字典中存储和操作数据,包括如何访问字典中的键值对、如何按顺序遍历字典以及如何在字典中存储列表和字典。此外,还讨论了如何在字典列表中修改特定外星人的属性,以及如何在字典中存储和访问比萨配料等信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第6章 字典

6.1 一个简单的字典

来看一个游戏,其中包含一些外星人,这些外星人的颜色和点数各不相同。下面是一个简单的字典,存储了有关特定外星人的信息:

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

字典alien_0存储了外星人的颜色和点数。使用两条print语句来访问并打印这些信息,如下所示:

green 
5

6.2 使用字典

在Python中,字典是一系列键—值对。每个键都与一个值相关联,你可以使用键来访问与之相关联的值。与键相关联的值可以是数字、字符串、列表乃至字典。事实上,可将任何Python对象用作字典中的值。
在Python中,字典用放在花括号{}中的一系列键—值对表示,如前面的示例所示:

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

键—值对是两个相关联的值。指定键时,Python将返回与之相关联的值。键和值之间用冒号分隔,而键—值对之间用逗号分隔。在字典中,你想存储多少个键—值对都可以。
最简单的字典只有一个键—值对,如下述修改后的字典alien_0所示:

alien_0 = {'color': 'green'}

这个字典只存储了一项有关alien_0的信息,具体地说是这个外星人的颜色。在这个字典中,字符串’color’是一个键,与之相关联的值为’green’。

6.2.1 访问字典中的值

要获取与键相关联的值,可依次指定字典名和放在方括号内的键,如下所示:

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

这将返回字典alien_0中与键’color’相关联的值:

green

字典中可包含任意数量的键—值对。
现在,你可以访问外星人alien_0的颜色和点数。如果玩家射杀了这个外星人,你就可以使用下面的代码来确定玩家应获得多少个点:

alien_0 = {'color': 'green', 'points': 5} 
new_points = alien_0['points'] 
print("You just earned " + str(new_points) + " points!")

上述代码首先定义了一个字典,然后从这个字典中获取与键’points’相关联的值,并将这个值存储在变量new_points中。接下来,将这个整数转换为字符串,并打印一条消息,指出玩家获得了多少个点:

You just earned 5 points!

6.2.2 添加键-值对

字典是一种动态结构,可随时在其中添加键—值对。要添加键—值对,可依次指定字典名、用方括号括起的键和相关联的值。

alien_0 = {'color': 'green', 'points': 5} 
print(alien_0) 
alien_0['x_position'] = 0 
alien_0['y_position'] = 25 
print(alien_0)
{'color': 'green', 'points': 5} 
{'color': 'green', 'points': 5, 'y_position': 25, 'x_position': 0}

6.2.3 先创建一个空字典

有时候,在空字典中添加键—值对是为了方便,而有时候必须这样做。为此,可先使用一对空的花括号定义一个字典,再分行添加各个键—值对。

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

这里首先定义了空字典alien_0,再在其中添加颜色和点数,得到前述示例一直在使用的字典:

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

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

6.2.4 修改字典中的值

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

alien_0 = {'color': 'green'} 
print("The alien is " + alien_0['color'] + ".") 
alien_0['color'] = 'yellow' 
print("The alien is now " + alien_0['color'] + ".")
The alien is green. 
The alien is now yellow.

来看一个更有趣的例子:对一个能够以不同速度移动的外星人的位置进行跟踪。为此,我们将存储该外星人的当前速度,并据此确定该外星人将向右移动多远:

alien_0 = {'x_position': 0, 'y_position': 25, 'speed': 'medium'} 
print("Original x-position: " + str(alien_0['x_position'])) 
# 向右移动外星人
# 据外星人当前速度决定将其移动多远
 if alien_0['speed'] == 'slow': 
    x_increment = 1 
elif alien_0['speed'] == 'medium': 
    x_increment = 2 
else: 
 # 这个外星人的速度一定很快
   x_increment = 3 
# 新位置等于老位置加上增量
alien_0['x_position'] = alien_0['x_position'] + x_increment
print("New x-position: " + str(alien_0['x_position']))

我们首先定义了一个外星人,其中包含初始的x坐标和y坐标,还有速度’medium’。使用了一个if-elif-else结构来确定外星人应向右移动多远,并将这个值存储在变量x_increment中。如果外星人的速度为’slow’,它将向右移动一个单位;如果速度为’medium’,将向右移动两个单位;如果为’fast’,将向右移动三个单位。确定移动量后,将其与x_position的当前值相加,再将结果关联到字典中的键x_position。

Original x-position: 0 
New x-position: 2

要将这个速度中等的外星人变成速度很快的外星人,可添加如下代码行:

alien_0['speed'] = fast

再次运行这些代码时,其中的if-elif-else结构将把一个更大的值赋给变量x_increment。

6.2.5 删除键-值对

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

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

注意: 删除的键—值对永远消失了。

6.2.6 由类似对象组成的字典

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

favorite_languages = { 
 'jen': 'python', 
 'sarah': 'c', 
 'edward': 'ruby', 
 'phil': 'python', 
 }
  print("Sarah's favorite language is " + 
 favorite_languages['sarah'].title() + ".") 
Sarah's favorite language is C.

6.3 遍历字典

6.3.1 遍历所有的键-值对

下面的字典存储一名用户的用户名、名和姓,可以使用一个for循环来遍历这个字典::

user_0 = { 
 'username': 'efermi', 
 'first': 'enrico', 
 'last': 'fermi', 
 }
 for key, value in user_0.items(): 
   print("\nKey: " + key) 
   print("Value: " + value)

要编写用于遍历字典的for循环,可声明两个变量,用于存储键—值对中的键和值。对于这两个变量,可使用任何名称。下面的代码使用了简单的变量名,这完全可行:

for k, v in user_0.items()

for语句的第二部分包含字典名和方法items(),它返回一个键—值对列表。

Key: last 
Value: fermi 
Key: first 
Value: enrico 
Key: username 
Value: efermi

注意,即便遍历字典时,键—值对的返回顺序也与存储顺序不同。Python不关心键—值对的存储顺序,而只跟踪键和值之间的关联关系。

favorite_languages = { 
 'jen': 'python', 
 'sarah': 'c', 
 'edward': 'ruby', 
 'phil': 'python', 
 } 
for name, language in favorite_languages.items(): 
   print(name.title() + "'s favorite language is " +  language.title() + ".")

这些描述性名称能够让人非常轻松地明白print语句是做什么的。

Jen's favorite language is Python. 
Sarah's favorite language is C. 
Phil's favorite language is Python. 
Edward's favorite language is Ruby

6.3.2 遍历字典中的所有键

在不需要使用字典中的值时,方法keys()很有用。下面来遍历字典favorite_languages,并将每个被调查者的名字都打印出来:

favorite_languages = { 
 'jen': 'python', 
 'sarah': 'c', 
 'edward': 'ruby', 
 'phil': 'python', 
 }
for name in favorite_languages.keys(): 
  print(name.title())
Jen 
Sarah 
Phil 
Edward

遍历字典时,会默认遍历所有的键,因此,如果将上述代码中的for name in favorite_ languages.keys():替换为for name in favorite_languages:,输出将不变。
在这种循环中,可使用当前键来访问与之相关联的值。下面来打印两条消息,指出两位朋友喜欢的语言。

favorite_languages = { 
 'jen': 'python', 
 'sarah': 'c', 
 'edward': 'ruby', 
 'phil': 'python', 
 } 
friends = ['phil', 'sarah'] 
for name in favorite_languages.keys(): 
   print(name.title()) 
  if name in friends: 
     print(" Hi " + name.title() + 
      ", I see your favorite language is " + 
      favorite_languages[name].title() + "!")

每个人的名字都会被打印,但只对朋友打印特殊消息

Edward 
Phil 
 Hi Phil, I see your favorite language is Python! 
Sarah 
 Hi Sarah, I see your favorite language is C! 
Jen

你还可以使用keys()确定某个人是否接受了调查。下面的代码确定Erin是否接受了调查:

favorite_languages = { 
 'jen': 'python', 
 'sarah': 'c', 
 'edward': 'ruby', 
 'phil': 'python', 
 } 
if 'erin' not in favorite_languages.keys():
    print("Erin, please take our poll!")

方法keys()并非只能用于遍历;实际上,它返回一个列表,其中包含字典中的所有键,因此1处的代码行只是核实’erin’是否包含在这个列表中。由于她并不包含在这个列表中,因此打印
一条消息,邀请她参加调查:

Erin, please take our poll!

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

字典总是明确地记录键和值之间的关联关系,但获取字典的元素时,获取顺序是不可预测的。这不是问题,因为通常你想要的只是获取与键相关联的正确的值。
要以特定的顺序返回元素,一种办法是在for循环中对返回的键进行排序。为此,可使用函数sorted()来获得按特定顺序排列的键列表的副本:

favorite_languages = { 
 'jen': 'python', 
 'sarah': 'c', 
 'edward': 'ruby', 
 'phil': 'python', 
 } 
for name in sorted(favorite_languages.keys()): 
 print(name.title() + ", thank you for taking the poll.")

这条for语句类似于其他for语句,但对方法dictionary.keys()的结果调用了函数sorted()。这让Python列出字典中的所有键,并在遍历前对这个列表进行排序。输出表明,按顺序显示了所
有被调查者的名字:

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.3.4 遍历字典中的所有值

如果你感兴趣的主要是字典包含的值,可使用方法values(),它返回一个值列表,而不包含任何键。

favorite_languages = { 
 'jen': 'python', 
 'sarah': 'c', 
 'edward': 'ruby', 
 'phil': 'python',
 } 
print("The following languages have been mentioned:") 
for language in favorite_languages.values(): 
  print(language.title())

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

The following languages have been mentioned: 
Python 
C 
Python 
Ruby

为剔除重复项,可使用集合(set)。集合类似于列表,但每个元素都必须是独一无二的:

favorite_languages = { 
 'jen': 'python', 
 'sarah': 'c', 
 'edward': 'ruby', 
 'phil': 'python', 
 } 
print("The following languages have been mentioned:") 
for language in set(favorite_languages.values()): 
  print(language.title())

结果是一个不重复的列表,其中列出了被调查者提及的所有语言:

The following languages have been mentioned: 
Python 
C 
Ruby

6.4 嵌套

有时候,需要将一系列字典存储在列表中,或将列表作为值存储在字典中,这称为嵌套。你可以在列表中嵌套字典、在字典中嵌套列表甚至在字典中嵌套字典。

6.4.1 字典列表

我们首先创建了三个字典,其中每个字典都表示一个外星人。

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()生成了30个外星人:

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

range()返回一系列数字,其唯一的用途是告诉Python我们要重复这个循环多少次。每次执行这个循环时,都创建一个外星人,并将其附加到列表aliens末尾。使用一个切片来打印前五个外星人。

{'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', 'color': 'green', 'points': 5} 
... 
Total number of aliens: 30

这些外星人都具有相同的特征,但在Python看来,每个外星人都是独立的,这让我们能够独立地修改每个外星人。
必要时,我们可以使用for循环和if语句来修改某些外星人的颜色。

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

鉴于我们要修改前三个外星人,需要遍历一个只包含这些外星人的切片。当前,所有外星人都是绿色的,但情况并非总是如此,因此我们编写了一条if语句来确保只修改绿色外星人。如果外星人是绿色的,我们就将其颜色改为’yellow’,将其速度改为’medium’,并将其点数改为10,如下面的输出所示:

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

你可以进一步扩展这个循环,在其中添加一个elif代码块,将黄色外星人改为移动速度快且值15个点的红色外星人,如下所示(这里只列出了循环,而没有列出整个程序):

for alien in aliens[0: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

6.4.2 在字典中存储列表

有时候,需要将列表存储在字典中,而不是将字典存储在列表中。
在下面的示例中,存储了比萨的两方面信息:外皮类型和配料列表。其中的配料列表是一个与键’toppings’相关联的值。要访问该列表,我们使用字典名和键’toppings’,就像访问字典中
的其他值一样。这将返回一个配料列表,而不是单个值:

 # 存储所点比萨的信息
 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 pizza with the following toppings: 
 mushrooms 
 extra cheese

每当需要在字典中将一个键关联到多个值时,都可以在字典中嵌套一个列表。

favorite_languages = { 
 'jen': ['python', 'ruby'], 
 'sarah': ['c'], 
 'edward': ['ruby', 'go'], 
 'phil': ['python', 'haskell'], 
 }
for name, languages in favorite_languages.items(): 
   print("\n" + name.title() + "'s favorite languages are:") 
for language in languages: 
  print("\t" + language.title())
Jen's favorite languages are: 
 Python 
 Ruby 
Sarah's favorite languages are: 
 C 
Phil's favorite languages are: 
 Python 
 Haskell 
Edward's favorite languages are: 
 Ruby 
 Go

6.4.3 在字典中存储字典

可在字典中嵌套字典,但这样做时,代码可能很快复杂起来。

users = { 
 'aeinstein': { 
 'first': 'albert', 
 'last': 'einstein', 
 'location': 'princeton', 
 }, 
 'mcurie': { 
 'first': 'marie', 
 'last': 'curie', 
 'location': 'paris', 
 }, 
 } 
for username, user_info in users.items(): 
   print("\nUsername: " + username) 
   full_name = user_info['first'] + " " + user_info['last'] 
   location = user_info['location'] 
   print("\tFull name: " + full_name.title()) 
   print("\tLocation: " + location.title())

我们首先定义了一个名为users的字典,其中包含两个键:用户名’aeinstein’和’mcurie’;与每个键相关联的值都是一个字典,其中包含用户的名、姓和居住地。

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

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

6.5 小结

在本章中,你学习了:如何定义字典,以及如何使用存储在字典中的信息;如何访问和修改字典中的元素,以及如何遍历字典中的所有信息;如何遍历字典中所有的键值对、所有的键和所有的值;如何在列表中嵌套字典、在字典中嵌套列表以及在字典中嵌套字典。
在下一章中,你将学习while循环以及如何从用户那里获取输入。这是激动人心的一章,让你知道如何将程序变成交互性的——能够对用户输入作出响应。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

苏璃只想划水

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

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

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

打赏作者

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

抵扣说明:

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

余额充值