列表-元组-字典-和集的 区别,总结何时使用它们
Python 有四个内置的容器类型: List, Tuple, Dictionary, Set。
在这篇文章中,我们将比较每种类型的属性,并总结何时使用它们。
1. Lists vs. Tuples
列表和图元是最相似的类型。 首先,这两种类型都有一个顺序,而且你可以使用索引来获得它们的元素。 另外,你可以在一个列表或元组中拥有多种类型的元素。 正因为如此,你可以在许多情况下使用这两种类型。
为了澄清这两种类型的用途,必须注意它们的区别。 在这一节中,我们将讨论这两种类型的区别,以便给你一些指导,告诉你何时使用它们。
1.1. 不变性
列表和图元之间最重要的区别是不可更改性。 列表可以被自由地添加和删除,列表中的元素也可以被轻易地修改。 另一方面,图元一旦被声明,就不能被添加、删除或修改。
让我们想一想,在实际应用中,我们何时需要不变性,何时不需要。
我们的任务是使用 Python 的容器类型实现购物车的几个功能。 需要可添加和可移除的购物车的基本特征是产品列表、购物车和用户列表。 这些功能应该使用列表。
反过来说,哪些特征需要是不可变的呢? 你可能会想到那些不会改变的元数据,例如用户的用户名、登录日期或商家的营业执照号码。 这些信息最好存储在图元中,这样数据就不会被不经意地改变。
在你的应用程序设计中考虑到不可更改性,也会帮助你与其他开发者沟通。 这是因为你可以在代码本身中表达,作为列表实现的功能是不可变的,而作为元组实现的功能则不应该被修改。
1.2. 类型的多样性
如前所述,列表和元组都可以一起包含多种类型的元素。 然而,如果我们把它们看成是上一节的延伸,故事就会有所不同。
我们提到,列表被用于诸如表单列表、购物车列表、用户列表等等。 这些列表挖出了相同种类的项目。 一个购物车列表只包含产品,一个用户列表只包含用户,以此类推。
users = [user1, user2, user3].
另一方面,如果我们把用户的元数据看作一个元组,元组的元素将是不同的类型。
User1 = ( 'ID', 'Created At', 'Business Registration Number', ... )
而这些数据的元组可以组合成一个列表。
Users = [
('User1', 'ID', 'Created At', 'Business Registration Number', ... )
('User2', 'ID', 'Created At', 'Business Registration Number', ... )
('User3', 'ID', 'Created At', 'Business Registration Number', ... )
]
1.3. 总结
综上所述,图元可以用来保存单个对象的各种信息,作为一个简单的类。 列表可以用来管理由图元组成的多个对象,作为一个列表。 这些是列表和图元最常见的用途。
我们在这里再提一个。 购物车中的产品列表应该只被购物车用户访问,而用户列表应该只被服务管理员访问。 这是一条不会改变的规则。 那么,为什么不把不同用户可以访问的列表作为图元来管理呢?
admin_lists = ( [User1, User2, ... ] , ... )
customer_lists = ([article1, article2, ... ] , ... )
正如你所看到的,当你在一个元组中包含一个列表时,该列表中的元素是可以修改的。 这是因为元组的不变性适用于对列表本身的引用,而不是对它所包含的元素。
2. 词典
区别字典和其它三种类型的主要特征是构成字典的键-值对。
字典的键就像 list 或 tuple 的索引。 列表或元组会使用一个数字索引来检索一个特定的元素,而 dictionary 可以使用任何有保证的不变性的类型作为一个键来检索一个值。
然后这些不可变的键可以被用作字典所基于的哈希表的目标。
这样做的好处是,检查一个键是否包含在字典中,或者通过一个键检索一个值,平均可以用O(1)
时间复杂度来完成。
与遍历列表和图元以确定一个元素是否被包含相比,这是很经济的。
因为它们是可以使用键值的字典,它们实际上比图元更容易建模。 你可以如下图所示组织产品信息或用户信息。 特别是对于那些需要自由修改的信息。
我将在另一篇文章中介绍,但不可变的属性信息很容易用NamedTuple类型管理。
Item1 = {
"名称": "产品A"、
"价格": 50.00,
"描述": "描述A"、
"库存": 10,
}
User1 = {
"姓名": "John Doe"、
"email": "john@example.com"、
"地址": "123街"
}
正如你所看到的,Python字典是实现任何需要属性和属性值的对象的一种方便的方法。
3. 集合型
有两个主要特征使集合类型区别于其他三种类型。
一个是它不允许重复。
当你用set.add()
方法添加一个新的值时,或者当你用set()
构造函数转换另一个容器类型时,集合会自我重复。
这使得重复数据删除比其他语言更容易。
一个流行的重复数据删除模式是将一个类型投到一个集合,然后再投回来,如下所示。
numbers = [1, 2, 2, 3, 3, 3, 3, 4, 5].
unique_numbers = list(set(numbers))
print(unique_numbers)
# 输出: [1, 2, 3, 4, 5]
集合的第二个属性是,它们可以有效地确定包含性。 在2.字典中,我们看到哈希表可以用来有效地确定一个键是否被包含。 一个集合中的值也被组织在一个哈希表中。 这使我们能够快速确定一个项目是否被包含。
此外,集合类型有内置的方法来告诉你相交、联合、差异和聚合关系。 这也意味着你不需要为这些函数编写代码。
例如,如果你想比较两个列表的包含关系,你可以做这样的事情
fruits_in_market = ['apple', 'banana', 'orange', 'pineapple'].
cart = ['banana', 'orange'].
set_fruits_in_market = set(fruit_in_market)
is_superset = set_fruits_in_market.issuperset(cart)
print(is_superset)
# 输出: True
通过将我们的一个列表转换为一个集合,我们可以用上面这样简单的代码做一些强大的事情。
现在让我们考虑一下购物车的功能,它利用了集合的两个伟大特性。
首先,我们可以构建一个分类列表,我们需要从中删除重复的内容,如下图所示,或者我们可以使用
product_categories = {"电子产品", "书籍", "服装", "家居装饰", "食品"}
将愿望清单与购物车集进行比较,我们还可以使用愿望清单在购物车中用爱心标记物品。
wish_list = ['iPhone 14 pro', 'PlayStaion 5', 'Bose QC 45']。
cart = ['PlayStaion 5', 'Nintendo Switch'].
heart_list = set(wish_list).intersection(cart)
print(heart_list)
# 输出: {'PlayStaion 5'}
4. 总结
在这一节中,我们已经看到了Python内置容器类型的特点和用途。 我对它们进行了总结,以帮助你对这四种类型有一个大致的了解、 但要始终保持开放的心态,创造性地思考如何使用它们。
关于每种类型的更多信息,请参见相应的子帖子。