文章目录
- 集合 set
- 创建集合
- 访问集合项
- in关键字
- 添加集合元素
- 删除集合元素
- 复制集合
- 使用操作符对集合进行交集、并集、差集、对称差集
- 使用方法对集合进行交集、并集、差集、对称差集
- 子集和超集
- frozenset 冻结集合? 不可变集合!
集合 set
什么是集合?简而言之,集合是一个无序、不重复的元素集。这与列表和元组都是有顺序的,而且它们中的元素是可以重复的不同。
创建集合
my_set = {1, 2, 3} # 在定义集合时直接添加元素
print(my_set)
# 也可以使用set()函数,不过还是推荐直接第一种直接定义的方式
# fruits = set(["apple", "banana", "peach", "watermelon"])
# print(fruits)
当我们创建下图中的集合并打印后:
我们会发现,打印出来的顺序和我们一开始输入的顺序并不一样,这是因为集合是无序的!
再次运行,可能会发现顺序仍然不一样:
**作为一个无序集合,集合不记录元素位置或插入顺序。**因此,集合也不支持索引、切片或其他序列行为。
那我们是否可以通过索引(像列表,或者元组那样),或者键(像字典那样)来访问集合中的元素?
答案是否定的。首先因为集合是无序的,所以,没有什么“索引”,更不要说打算用索引来访问集合中的元素了。
也不能通过键来访问集合中的元素,因为集合不同于字典(拥有键值对),没有键,所以不能。
形象地来讲,**我们可以将它看作是一袋弹珠,其中每个弹珠都不同于其他弹珠。**所以我们无法从这个袋子中拿出一个特定的弹珠——比如:我们不能说“给我第三个弹珠”,因为弹珠是没有特定顺序的。
访问集合项
使用for
循环访问集合项:
你会发现,输出的元素的顺序并不和我们定义的顺序相同,这其实还是因为集合的“无序性”,其实主要是因为其元素的存储顺序由哈希值、哈希表实现细节和元素插入时的哈希冲突解决策略决定,与定义时的顺序无关。
在这个例子中,我们就像一个好奇的孩子,伸进我们的弹珠袋(我们的集合),一次拉出一个弹珠(项)来检查。只不过for
循环自动为我们执行此操作,遍历集合中的每个项。
使用while
循环借助列表遍历集合:
fruits = {"apple", "banana", "cherry"}
fruit_list = list(fruits)
i = 0
while i < len(fruit_list):print(fruit_list[i])i += 1# i++ # 在 Python 中,i++ 这种用法是不合法的,因为 Python 要求在一行中只能有一个语句。如果你尝试在一行中写 i+ 后面直接换行,Python 解释器会报语法错误,因为它期望在 + 之后有操作数。
in关键字
我们经常需要检查集合中是否存在特定的项,我们可以使用in
关键字来实现。
这就像我们拿着一个特定颜色的弹珠,看看我们是否能找到那个颜色的弹珠。
添加集合元素
- 只添加一项的话,我们常使用add()方法
fruit_basket = {"apple", "banana", "orange"}
fruit_basket.add("strawberry")
# fruit_basket.add("apple")
print(fruit_basket)
如果我们尝试添加已经在集合中的项,Python会简单地忽略它。我们的水果篮子里不允许有重复!
- 如果我们想一次性添加多个项,我们常常使用
update()
方法,update()
方法可以接受各种可迭代对象,如列表、元组,甚至是其他集合。
fruit_basket = {"apple", "banana", "orange"}
# fruit_basket.update({"strawberry", "kiwi", "pear"})
fruit_basket.update(["strawberry", "kiwi", "pear"])
# fruit_basket.update(("strawberry", "kiwi", "pear"))
print(fruit_basket)
- 从数学角度来考虑,我们还可以使用并集运算符
(|)
来合并两个集合。这就像是我们合并了两个独特的弹珠盒。
- 也可以使用
union()
方法
当然也可以使用上面说过的update()
方法:basket1.update(basket2)
删除集合元素
my_set = {1, 2, 3}
element = my_set.pop() # 移除并返回任意一个元素
print(f"Removed element: {element}")
print("Removed element:" + str(element))
my_set.remove(2)
my_set.remove(0)
my_set.discard(0)
my_set.discard(1)
my_set.clear()
print(my_set)
pop()
方法:移除并返回集合中随机的一个元素,就好像我们闭上双眼,随机从袋子中取出一个弹珠一样
remove()
方法:移除指定的确切元素;如果集合中不存在该元素,则会报错
discard()
方法:移除指定的确切元素;即使集合中不存在该元素,也不会报错
clear()
方法:一次性清空集合中的所有元素
复制集合
为什么我们需要复制集合?复制集合在你想要创建一个具有与现有集合相同元素的新集合时至关重要,但你不想让新集合的更改影响原始集合。这就像复印一份文件——你可以在复印件上写字而不会更改原始文件。
我们可以使用copy()
方法复制集合:
使用操作符对集合进行交集、并集、差集、对称差集
运算符 | 名称 | 描述 |
---|---|---|
| | 并集 | 组合两个集合中的元素 |
& | 交集 | 返回两个集合中共有的元素 |
- | 差集 | 返回第一个集合中有但第二个集合中没有的元素 |
^ | 对称差集 | 返回在任一集合中,但不同时在两个集合中的元素 |
set1 = {1, 2, 3}
set2 = {3, 4, 5}
union = set1 | set2
print(f"并集:{union}")
intersection = set1 & set2
print(f"交集:{intersection}")
difference = set1 - set2
print(f"差集:{difference}")
symmetric_difference = set1 ^ set2
print(f"对称差集:{symmetric_difference}")
使用方法对集合进行交集、并集、差集、对称差集
intersection()
方法
all_fruits = {"apple", "banana", "cherry", "strawberry", "pear"}
citrus_fruits = {"lemon", "orange", "mango"}
my_fruits = {"apple", "cherry", "orange"}
common_fruits = all_fruits.intersection(my_fruits)
print(common_fruits)# 输出:{'apple', 'cherry'}
这就相当于我们有两个弹珠袋,我们正在挑出两个袋子中都有的弹珠。
-
union()
方法上面已有示例,此处不再赘述。 -
difference()
方法找到在一个集合中但不在另一个集合中的元素。这就像找出哪些朋友没有被邀请到另一个派对。
# 我们创建两个编程语言集合
popular_languages = {"Python", "JavaScript", "Java", "C++"}
languages_i_know = {"Python", "JavaScript", "HTML"}# 现在,我们找到差集
languages_to_learn = popular_languages.difference(languages_i_know)
print(languages_to_learn)
# 输出:{'C++', 'Java'}
symmetric_difference()
方法将给出所有在任一集合中但不在两个集合中都有的元素。
# Let's create two sets of books
my_books = {"1984", "The Hobbit", "Pride and Prejudice"}
friend_books = {"The Hobbit", "To Kill a Mockingbird", "Pride and Prejudice"}
unique_books = my_books.symmetric_difference(friend_books)
print(unique_books)
子集和超集
-
使用
issubset()
方法来判断一个集合是否是另一个集合的子集 -
使用
issuperset()
方法来判断一个集合是否是另一个集合的超集
frozenset 冻结集合? 不可变集合!
frozenset
是 Python 中的一种数据结构,它也是集合(set
)的一种。与常规的集合(set
)相比,frozenset
是不可变的,这意味着一旦创建了 frozenset
,就不能添加、删除或修改其中的元素。
创建 frozenset
frozenset
可以用与创建集合类似的方式创建,但使用 frozenset()
函数:
my_frozenset = frozenset([1, 2, 3])
或者直接使用字面量语法:
my_frozenset = frozenset({1, 2, 3})
frozenset
具有不可变性,frozenset
对象一旦创建,就不能修改。尝试修改 frozenset
将导致运行时错误(RuntimeError
)。由于不可变性,frozenset
可以作为字典的键或另一个集合的元素。
# 创建一个 frozenset
my_frozenset = frozenset([1, 2, 3])
my_frozenset.add(4)# frozenset 可以作为字典的键
my_dict = {my_frozenset: "value"}
print(my_dict) # 输出:{frozenset({1, 2, 3}): 'value'}