Python编程基础(五) | 字典
引言
很久没有写 Python 了,有一点生疏。这是学习《Python 编程:从入门到实践(第3版)》的课后练习记录,主要目的是快速回顾基础知识。
练习1:人
使用一个字典来存储一个人的信息,包括名、姓、年龄和居住的城市。该字典应包含键 first_name
、last_name
、age
和 city
。将存储在该字典中的每项信息都打印出来。
# 创建一个表示人的字典
alice = {'first_name': 'Alice', 'last_name': 'Cooper', 'age': 30, 'city': 'New York'}# 使用 f-string 格式化并打印信息
# .title() 方法让姓名和城市名的首字母大写,显得更规范
print(f"{alice['first_name'].title()} {alice['last_name'].title()} is "f"{alice['age']} years old. He lives in {alice['city'].title()}."
)
Alice Cooper is 30 years old. He lives in New York.
知识点回顾:
- 字典创建:使用花括号
{}
创建字典,内部包含键值对。 - 键值对:每个元素由一个键(key)和一个值(value)组成,用冒号
:
分隔。 - 访问字典值:通过方括号
[]
和键名来访问对应的值,例如alice['first_name']
。 - f-string:格式化字符串的强大工具,可以直接在字符串中嵌入变量和表达式。
- 字符串方法:
.title()
将字符串中每个单词的首字母转换为大写。
练习2:喜欢的数1
使用一个字典来存储一些人喜欢的数。请想出5个人的名字,并将这些名字用作字典中的键。再想出每个人喜欢的一个数,并将这些数作为值存储在字典中。打印每个人的名字和喜欢的数。
favorite_numbers = {'张三': 7,'李四': 42,'王五': 13,'赵六': 21,'崔九': 99,
}# 逐个打印每个人的信息
# 注意:这种重复的打印方式在后续练习中会被循环所优化
print(f"张三最喜欢的数字是:{favorite_numbers['张三']}")
print(f"李四最喜欢的数字是:{favorite_numbers['李四']}")
print(f"王五最喜欢的数字是:{favorite_numbers['王五']}")
print(f"赵六最喜欢的数字是:{favorite_numbers['赵六']}")
print(f"崔九最喜欢的数字是:{favorite_numbers['崔九']}")
张三最喜欢的数字是:7
李四最喜欢的数字是:42
王五最喜欢的数字是:13
赵六最喜欢的数字是:21
崔九最喜欢的数字是:99
知识点回顾:
- 多样化的键和值:字典的键和值可以是不同类型的数据,这里使用了字符串作为键,整数作为值。
- 代码重复:当需要对字典中的每个元素执行相同或类似操作时,多次调用
print()
会导致代码冗余。这为后续学习使用循环来简化代码埋下了伏笔。
练习3:词汇表1
想出你在前面学过的5个编程术语,将它们用作词汇表中的键,并将它们的含义作为值存储在词汇表中。以整洁的方式打印每个术语及其含义。
programming_terms = {'变量': '用于存储数据值的内存位置的名称。','函数': '执行特定任务的可重用代码块。','列表': 'Python中用于存储有序项目集合的数据结构。','字典': 'Python中用于存储键值对集合的数据结构。','循环': '重复执行代码块直到满足特定条件的控制流语句。'
}# 按照练习2的模式,逐个打印术语和定义
print(f"变量:{programming_terms['变量']}")
print(f"函数:{programming_terms['函数']}")
print(f"列表:{programming_terms['列表']}")
print(f"字典:{programming_terms['字典']}")
print(f"循环:{programming_terms['循环']}")
变量:用于存储数据值的内存位置的名称。
函数:执行特定任务的可重用代码块。
列表:Python中用于存储有序项目集合的数据结构。
字典:Python中用于存储键值对集合的数据结构。
循环:重复执行代码块直到满足特定条件的控制流语句。
知识点回顾:
- 字典的实际应用:字典是模拟现实世界“词汇表”、“名片夹”等“键-值”对应关系数据的理想选择。
- 长字符串:字典的值可以是较长的字符串,用于存储定义、描述等信息。
练习4:词汇表2
现在你知道了如何遍历字典,请整理你为练习3编写的代码,将其中的一系列函数调用 print()
替换为一个遍历字典中键和值的循环。
programming_terms = {'变量': '用于存储数据值的内存位置的名称。','函数': '执行特定任务的可重用代码块。','列表': 'Python中用于存储有序项目集合的数据结构。','字典': 'Python中用于存储键值对集合的数据结构。','循环': '重复执行代码块直到满足特定条件的控制流语句。',# 新增5个术语'模块': '一个包含Python代码的文件,可以被导入到其他程序中使用。','类': '创建对象的蓝图或模板。','继承': '一个类获取另一个类属性和方法的方式。','注释': '在代码中用于解释说明的文本,解释器会忽略它。','切片': '从列表、元组或字符串中获取一部分元素的操作。',
}# 使用 for 循环和 .items() 方法遍历字典
for term, definition in programming_terms.items():print(f"{term}:\n\t{definition}\n") # 采用换行和缩进,使输出更整洁
变量:用于存储数据值的内存位置的名称。函数:执行特定任务的可重用代码块。列表:Python中用于存储有序项目集合的数据结构。字典:Python中用于存储键值对集合的数据结构。循环:重复执行代码块直到满足特定条件的控制流语句。模块:一个包含Python代码的文件,可以被导入到其他程序中使用。类:创建对象的蓝图或模板。继承:一个类获取另一个类属性和方法的方式。注释:在代码中用于解释说明的文本,解释器会忽略它。切片:从列表、元-组或字符串中获取一部分元素的操作。
知识点回顾:
- 遍历字典:使用
for
循环是处理字典中所有元素的标准方法。 .items()
方法:返回一个包含字典所有键值对的视图对象。在循环中,可以方便地将键和值同时赋给两个变量(如term
和definition
)。- 代码的可扩展性:使用循环后,向字典中添加新内容(如新增的5个术语),打印代码无需任何修改,程序会自动处理新数据。
- 格式化输出:使用换行符
\n
和制表符\t
可以让输出的格式更加清晰、易读。
练习5:河流
创建一个字典,在其中存储三条河流及其流经的国家。使用循环为每条河流打印一条消息、所有河流的名字以及所有国家的名字。
rivers = {'长江': '中国','尼罗河': '埃及','亚马逊河': '巴西','黄河': '中国', # 增加一个重复的国家,以测试去重效果
}print("--- 每条河流及其流经的国家 ---")
for river, country in rivers.items():print(f"{river.title()} 流经 {country.title()}。")print("\n--- 字典中包含的河流 ---")
# .keys() 方法返回所有键
for river in rivers.keys():print(river.title())print("\n--- 字典中包含的国家(已去重)---")
# .values() 方法返回所有值
# 使用 set() 来获取独一无二的国家列表
for country in set(rivers.values()):print(country.title())
--- 每条河流及其流经的国家 ---
长江 流经 中国。
尼罗河 流经 埃及。
亚马逊河 流经 巴西。
黄河 流经 中国。--- 字典中包含的河流 ---
长江
尼罗河
亚马逊河
黄河--- 字典中包含的国家(已去重)---
中国
埃及
巴西
知识点回顾:
.keys()
方法:用于获取字典中所有的键。在for
循环中,for key in my_dict:
是for key in my_dict.keys():
的简写形式。.values()
方法:用于获取字典中所有的值。set()
函数:可以将一个可迭代对象(如列表)转换为集合,集合的一个重要特性是所有元素都是唯一的。这在需要从包含重复项的值中提取唯一列表时非常有用。
练习6:调查
创建一个已参与调查的人员字典和一个完整的待调查人员名单。遍历名单,对已参与调查的人表示感谢,对未参与的人发出邀请。
favorite_languages = {'jen': 'python','sarah': 'c','edward': 'rust','phil': 'python',
}persons_to_poll = ['jen', 'sarah', 'edward', 'phil', 'jack', 'jill']for name in persons_to_poll:# 检查名字是否存在于字典的键中# 'if name in favorite_languages' 是 'if name in favorite_languages.keys()' 的简洁写法if name in favorite_languages:print(f"Thank you for taking the poll, {name.title()}!")else:print(f"{name.title()}, what's your favorite programming language?")
Thank you for taking the poll, Jen!
Thank you for taking the poll, Sarah!
Thank you for taking the poll, Edward!
Thank you for taking the poll, Phil!
Jack, what's your favorite programming language?
Jill, what's your favorite programming language?
知识点回顾:
- 检查键是否存在:使用
in
关键字是判断一个键是否在字典中的最直接、最 Pythonic 的方式。if key in my_dict:
效率高且可读性好。 - 结合列表和字典:这是一个常见的编程模式,通过遍历一个列表,并使用列表中的元素作为键去查询或操作一个字典。
练习7:人们
创建两个新的“人”字典,并将所有三个“人”字典存储在一个名为 people
的列表中。遍历这个列表,将其中每个人的所有信息都打印出来。
# 创建三个独立的字典
alice = {'first_name': 'Alice', 'last_name': 'Cooper', 'age': 30, 'city': 'New York'}
bob = {'first_name': 'Bob', 'last_name': 'Dylan', 'age': 35, 'city': 'Paris'}
carol = {'first_name': 'Carol', 'last_name': 'Garcia', 'age': 25, 'city': 'London'}# 将字典作为元素存入列表
people = [alice, bob, carol]# 遍历列表,列表中的每个元素都是一个字典
for person in people:full_name = f"{person['first_name']} {person['last_name']}"age = person['age']city = person['city']print(f"{full_name.title()} is {age} years old and lives in {city}.")
Alice Cooper is 30 years old and lives in New York.
Bob Dylan is 35 years old and lives in Paris.
Carol Garcia is 25 years old and lives in London.
知识点回顾:
- 嵌套:列表中的字典:这是 Python 中一种极其重要和常见的数据结构,用于表示一组结构相同的对象集合(例如,用户列表、商品列表等)。
- 遍历嵌套结构:通过
for
循环遍历列表,在循环体内部,每个person
变量就是一个字典,可以像普通字典一样通过键来访问其内部的数据。
练习8:宠物
创建多个表示宠物的字典,将它们存储在 pets
列表中,然后遍历列表并打印每个宠物的信息。
# 创建多个字典,每个代表一个宠物
pet_1 = {"type": "cat", "owner": "Jane"}
pet_2 = {"type": "dog", "owner": "Bob"}
pet_3 = {"type": "parrot", "owner": "Alice"}# 将这些字典放入一个列表中
pets = [pet_1, pet_2, pet_3]# 遍历列表并打印信息
for pet in pets:pet_type = pet['type'].title()owner_name = pet['owner'].title()print(f"{owner_name} owns a {pet_type}.")
Jane owns a Cat.
Bob owns a Dog.
Alice owns a Parrot.
知识点回顾:
- 巩固“列表中的字典”结构:这个练习再次强化了使用列表来组织和管理多个字典(结构化数据对象)的方法。
- 代码清晰性:在循环内部,将字典的值赋给临时变量(如
pet_type
,owner_name
)可以使后续的print
语句更简洁、易读。
练习9:喜欢的地方
创建一个字典,键是人名,值是他们喜欢的地点列表。遍历字典,打印每个人的名字及其喜欢的地方。
favorite_places = {'张三': ['北京', '上海', '广州'],'李四': ['成都', '重庆'],'王五': ['深圳'],
}for name, places in favorite_places.items():print(f"\n{name} 喜欢的地方是:")# 遍历作为字典值的列表for place in places:print(f"- {place}")
张三 喜欢的地方是:
- 北京
- 上海
- 广州李四 喜欢的地方是:
- 成都
- 重庆王五 喜欢的地方是:
- 深圳
知识点回顾:
- 嵌套:字典中的列表:当一个键需要关联多个值时,可以将一个列表(或元组)作为字典的值。这极大地扩展了字典的表达能力。
- 嵌套循环:需要一个外层循环来遍历字典的键值对,还需要一个内层循环来遍历作为值的列表中的每个元素。
练习10:喜欢的数2
修改练习2的程序,让每个人可以有多个喜欢的数字。然后打印每个人的名字及其喜欢的数。
favorite_numbers = {'张三': [7, 13, 19],'李四': [17, 23, 29],'王五': [13],'赵六': [8, 16, 32],
}for name, numbers in favorite_numbers.items():print(f"\n{name} 喜欢的数字有:")# 将数字列表转换为字符串列表,然后用逗号连接numbers_str = ", ".join([str(num) for num in numbers])print(f" {numbers_str}")
张三 喜欢的数字有:7, 13, 19李四 喜欢的数字有:17, 23, 29王五 喜欢的数字有:13赵六 喜欢的数字有:8, 16, 32
知识点回顾:
- 巩固“字典中的列表”结构:再次应用了前一个练习的知识,证明了其通用性。
- 列表推导式:
[str(num) for num in numbers]
是一个简洁的列表推导式,它遍历numbers
列表,将每个数字转换为字符串,并生成一个新的字符串列表。 .join()
字符串方法:这是一个非常有用的方法,可以将一个字符串列表的所有元素用指定的分隔符(这里是", "
)连接成一个单一的字符串。
练习11:城市
创建一个名为 cities
的字典,其中键是城市名,值是包含该城市信息的另一个字典(国家、人口、事实)。打印每座城市的名字及其所有信息。
cities = {'New York': {'country': 'USA','population': 8_500_000, # 使用下划线提高大数字的可读性'fact': 'The city that never sleeps.',},'Paris': {'country': 'France','population': 2_141_000,'fact': 'Known as the City of Lights.',},'London': {'country': 'England','population': 8_908_081,'fact': 'The capital of Great Britain.',},
}# 遍历外层字典
for city, city_info in cities.items():print(f"\n城市: {city.title()}")# 从内层字典中获取信息country = city_info['country']population = city_info['population']fact = city_info['fact']print(f" 国家: {country.title()}")print(f" 人口: {population:,}") # 使用:,格式化数字,自动添加千位分隔符print(f" 趣闻: {fact}")
城市: New York国家: Usa人口: 8,500,000趣闻: The city that never sleeps.城市: Paris国家: France人口: 2,141,000趣闻: Known as the City of Lights.城市: London国家: England人口: 8,908,081趣闻: The capital of Great Britain.
知识点回顾:
- 嵌套:字典中的字典:这是最强大的嵌套结构之一,非常适合表示具有多个固定属性的复杂对象。外层字典的键(城市名)用于快速查找,内层字典则存储了该对象的完整信息。
- 遍历深度嵌套结构:通过外层循环获取到内层字典后,可以直接通过键来访问最深层的数据。
- 高级 f-string 格式化:在 f-string 中,可以使用格式说明符。
{population:,}
会自动为数字添加千位分隔符(逗号),使输出更专业、易读。