python集合与列表的区别

凯子敏感吗? / 2023-08-10 / 原文

集合和列表的不同使用场景和区别

唯一性:集合中的元素是唯一的,不允许有重复值,而列表中的元素可以重复。

set1 = {1, 2, 3, 3, 4, 5}  # 集合中的元素会自动去重
print(set1)  # 输出:{1, 2, 3, 4, 5}

list1 = [1, 2, 3, 3, 4, 5]  # 列表中的元素可以重复
print(list1)  # 输出:[1, 2, 3, 3, 4, 5]

可变性:列表是可变的,可以通过索引值来修改、添加或删除元素。而集合是不可变的,无法修改其中的元素,只能通过添加或删除操作来改变集合。

list1 = [1, 2, 3, 4, 5]
list1[0] = 10  # 可以修改列表中的元素
print(list1)  # 输出:[10, 2, 3, 4, 5]

set1 = {1, 2, 3, 4, 5}
set1.add(6)  # 可以通过添加操作来改变集合
print(set1)  # 输出:{1, 2, 3, 4, 5, 6}

 

排序:列表是有序的,元素的顺序根据插入的先后顺序决定。而集合是无序的,元素的顺序是不确定的。

list1 = [3, 2, 1, 4, 5]  # 有序列表
print(list1)  # 输出:[3, 2, 1, 4, 5]

set1 = {3, 2, 1, 4, 5}  # 无序集合
print(set1)  # 输出:{1, 2, 3, 4, 5}

 

存储方式:列表是有序的序列存储,可以通过索引值来访问元素。而集合使用哈希表存储元素,不支持索引操作,因为元素的顺序是不确定的。

list1 = [1, 2, 3, 4, 5]
print(list1[0])  # 输出:1

set1 = {1, 2, 3, 4, 5}
# print(set1[0])  # TypeError: 'set' object is not subscriptable

 

综上所述,列表常用于需要有序、可以重复、可进行修改的场景,而集合常用于需要唯一性、无序的场景,并且集合对于判断元素是否存在、去除重复元素等操作更高效。

为什么要把集合设置成不可变的,那么不是无法修改数据,从而给我们带来了麻烦吗?为什么要这样做?

Python中的集合数据类型是一种可哈希的、不可变的数据结构,即使集合中的元素是可变的,集合本身仍然是不可变的。这个设计决策是有其合理性的,以下是一些原因:

  1. 哈希集合的快速查找:集合是基于哈希表实现的,它们提供了快速的元素查找操作。为了维持哈希集合的高效性能,集合需要保持不变性。如果允许修改集合中的元素,那么在修改元素后,就需要重新计算哈希值和重新定位元素在哈希表中的位置,从而影响了查找的时间复杂度。

  2. 集合的可靠性和一致性:不可变性确保了集合在被多个线程或多个代码段同时访问时的一致性。如果集合是可变的,同时有多个线程/代码段修改集合,就可能导致数据不一致或者出现竞态条件。

  3. 集合的线程安全性:由于集合是不可变的,它们是线程安全的。这意味着多个线程可以同时访问和共享一个集合对象,而无需使用额外的同步机制。这对于并发编程是非常有用的。

虽然集合是不可变的,但是Python提供了许多集合操作和方法,例如集合的合并、差集、交集等,以及用于添加和删除元素的方法。这些方法可以满足大多数使用场景。如果需要可变的集合,可以使用列表(List)作为替代。