引言
在前两篇文章中,我们讨论了Python中的基本数据类型和列表操作。本文将深入探讨Python中的元组和字典。元组和字典是Python中常用的数据结构,各自有其独特的用途和特点。了解这些数据结构将有助于我们编写更高效、更可靠的代码。
元组
元组类似于列表,但一旦创建,它们就不能被修改,这意味着它们是不可变的。
- 不能向元组添加元素,因此没有 extend 或 append 方法。
- 不能删除或插入元素,因此没有 insert、remove 或 pop 方法。
- 可以使用 in 运算符或索引进行查找。
- 元组的速度比列表快得多。
元组适用于需要保护的数据。在Python中,使用(..., ..., ...)
或..., ...
语法来创建元组:
创建元组
point = (10, 20)
point2 = 10, 20
print("1: ", point, type(point))
print("2: ", point2, type(point2))
解包元组
x, y = point
print("1: x =", x)
print("2: y =", y)
元组不可变
# point[0] = 20 # 这会报错
字典
字典类似于列表,但每个元素都是一个键值对。字典的语法是{key1 : value1, ...}
:
创建字典
some_dict = {"Pineapple" : 12,
"Orange" : 10,
"Apple" : 15,}
print("1: ", type(some_dict))
print("2: ", some_dict)
访问字典元素
print("1: Pineapple = " + str(some_dict["Pineapple"]))
print("2: Orange = " + str(some_dict["Orange"]))
print("3: Apple = " + str(some_dict["Apple"]))
添加新键值对
some_dict["Durian"] = 50
遍历字典
for key in some_dict:
print("1:", key + " = " + str(some_dict[key]))
# 使用 items() 方法
for key, value in some_dict.items():
print("2:", key, value)
# 使用 sorted() 方法
for key, value in sorted(some_dict.items()):
print("3:", key, value)
# 使用 enumerate 方法
for index, (key, value) in enumerate(some_dict.items()):
print("4:", index, key, value)
集合
集合是一种无序且不重复的数据结构。
set_a = {'d','e','a','a','a','b','b','c','a'}
print(set_a) # 删除所有重复的成员
print(len(set_a)) # 计算唯一成员的总数
set_a = set({'a','b','c','d'}) # 可以使用 `set` 构造函数显式声明集合
set_b = set(['a','b','c','c','d','d']) # 列表也可以转换为集合
print(f"{set_a=}")
print(f"{set_b=}")
# 两个集合相等当且仅当 set_a 是 set_b 的子集且 set_b 是 set_a 的子集。记住了吗?
print("Is set_a is subset of set_b:", set_a.issubset(set_b))
print("Is set_b is subset of set_a:", set_b.issubset(set_a))
# 或者直接使用比较运算符
print("Is set_a and set_b are the same:", set_a == set_b)
# 集合对象有我们都喜欢的基本函数/操作。
print("Intersection:", set_a.intersection(set_b))
print("Union:", set_a.union(set_b))
print("Difference:", set_a.difference(set_b), "is an empty set")
Python 集合类型
我们已经完成了Python中的四种基本集合类型。它们之间的区别如下:
- 列表 是一个有序且可变的集合。允许重复成员。
- 元组 是一个有序且不可变的集合。允许重复成员。
- 集合 是一个无序、不可变且未索引的集合。没有重复成员。
- 字典 是一个有序且可变的集合。没有重复成员。
这些集合类型各自有其特定的用途。了解每种数据结构的特点,可以帮助我们选择最适合当前任务的工具。
=== 任务 4 ===
-
创建一个包含年龄、性别和身高的元组变量,然后尝试打印该元组变量的性别。
-
创建一个包含年龄、姓名、性别和ID号的字典。遍历字典并打印键值对。
-
给定一个整数n,编写一个程序生成一个包含 (i, i*i) 的字典,其中i是1到n之间的整数(包括1和n)。程序应打印生成的字典。例如,给定输入8,输出应为:
{1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64}
-
编写一个程序,按升序排序 (name, age, height) 元组,其中name是字符串,age和height是数字。排序标准是:
- 首先按name排序;
- 然后按age排序;
- 最后按height排序。
如果给定以下元组作为输入:
Tom,19,80 John,20,90 Jony,17,91 Jony,17,93 Json,21,85
程序输出应为:
[('John', '20', '90'), ('Jony', '17', '91'), ('Jony', '17', '93'), ('Json', '21', '85'), ('Tom', '19', '80')]
提示:使用itemgetter启用多个排序键。此外,sorted接收一个名为key的参数。因此,可以使用 sorted(the_tuple, key = itemgetter(0,1,2)),其中0, 1, 2对应name, age, height。
-
编写一个函数,接受以下参数:
- name和age,其中name是默认值为"N/A"的关键字参数;
- 一个未知长度的家庭工资列表(例如20000, 30000, 10000)。长度未知是因为我们永远不知道任何家庭的大小。提示:使用
*args
; - 一个包含孩子及其学校名称的字典(例如,Peter = 'Saint Peter', John = 'Pattaya International School')。长度未知。提示:使用
*kwargs
。
以任何首选格式打印所有信息。例如,
some_func(30, 30000, 40000, name='Chaky', John="some_school", Peter="another_school")
应打印:
Chaky has age of 30 with family salary of 70000 The school of John is some_school The school of Peter is another_school
提示:在处理多种类型的参数时,重要的是保持参数的顺序,否则会出现语法错误:
def example2(arg_1, arg_2, *args, kw_1="something", kw_2="something", **kwargs)
其中arg_1和arg_2是普通参数,
*args
是可变长度参数,kw_1和kw_2是关键字参数,**kwargs
是字典可变长度参数。
实现代码
# 1. 创建一个包含年龄、性别和身高的元组变量,然后尝试打印该元组变量的性别。
person_info = (25, 'Male', 175)
print("Gender:", person_info[1])
# 2. 创建一个包含年龄、姓名、性别和ID号的字典。遍历字典并打印键值对。
person_dict = {
"Age": 25,
"Name": "John Doe",
"Gender": "Male",
"ID": 12345
}
for key, value in person_dict.items():
print(f"{key}: {value}")
# 3. 给定一个整数n,编写一个程序生成一个包含 (i, i*i) 的字典,其中i是1到n之间的整数(包括1和n)。程序应打印生成的字典。
n = 8
squares_dict = {i: i * i for i in range(1, n + 1)}
print(squares_dict)
# 4. 编写一个程序,按升序排序 (name, age, height) 元组,其中name是字符串,age和height是数字。
from operator import itemgetter
people = [
("Tom", 19, 80),
("John", 20, 90),
("Jony", 17, 91),
("Jony", 17, 93),
("Json", 21, 85)
]
sorted_people = sorted(people, key=itemgetter(0, 1, 2))
print(sorted_people)
# 5. 编写一个函数,接受以下参数并打印所有信息。
def some_func(age, *salaries, name='N/A', **kids):
total_salary = sum(salaries)
print(f"{name} has age of {age} with family salary of {total_salary}")
for kid, school in kids.items():
print(f"The school of {kid} is {school}")
some_func(30, 30000, 40000, name='Chaky', John="some_school", Peter="another_school")
结语
通过这篇文章,我们深入探讨了Python中的元组、字典和集合操作。我们学习了如何创建和操作这些数据结构,并通过一系列任务巩固了所学知识。元组提供了不可变的数据存储方式,适用于需要保护的数据;字典提供了键值对的数据存储方式,方便快速查找和更新;集合提供了一种无序且不重复的数据存储方式,适用于需要去重和集合操作的场景。
掌握这些数据结构将使我们的代码更高效、更可靠。在接下来的文章中,我们将探讨异常处理、函数和类等高级特性,为大家编写复杂的Python程序打下坚实的基础。希望大家通过实践任务逐步提高编程技能,继续在数据科学的世界中探索。
如果你觉得这篇博文对你有帮助,请点赞、收藏、关注我,并且可以打赏支持我!
欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。
谢谢大家的支持!