9.5 KiB
Python 101:学习集合
原文:https://www.blog.pythonlibrary.org/2020/04/28/python-101-learning-about-sets/
根据 Python 3 文档,数据类型被定义为“不同可散列对象的无序集合”。您可以使用set进行成员测试,从序列中删除重复项,并计算数学运算,如交集、并集、差集和对称差集。
由于它们是无序的集合,set不记录元素的位置或插入顺序。因此,它们也不支持索引、切片或其他类似序列的行为,而这些行为你在列表和元组中见过。
Python 语言内置了两种类型的set:
- 可变的
- 这是不可改变的,也是可改变的
本文将重点介绍set。
您将学习如何使用器械包执行以下操作:
- 创建一个
set - 访问
set成员 - 时代的变化
- 添加项目
- 移除项目
- 删除一个
set
让我们从创建一套开始吧!
|
| Would you like to learn more about Python?
Python 101 -第二版
在 Leanpub 上立即购买 |
创建集合
创建一个set非常简单。您可以通过在花括号内添加一系列逗号分隔的对象来创建它们,或者您可以将一个序列传递给内置的set()函数。
让我们看一个例子:
>>> my_set = {"a", "b", "c", "c"}
>>> my_set
{'c', 'a', 'b'}
>>> type(my_set)
<class 'set'>
A set使用了你用来创建字典的相同的花括号。请注意,您有一系列值,而不是key: value对。当您打印出set时,您可以看到重复的内容被自动删除了。
现在让我们尝试使用set()创建一个set:
>>> my_list = [1, 2, 3, 4]
>>> my_set = set(my_list)
>>> my_set
{1, 2, 3, 4}
>>> type(my_set)
<class 'set'>
在这个例子中,您创建了一个list,然后使用set()将其转换为一个set。如果list中有任何重复,它们将被删除。
现在让我们继续,看看可以用这种数据类型做些什么。
访问集合成员
您可以使用 Python 的in操作符来检查项目是否在set中:
>>> my_set = {"a", "b", "c", "c"}
>>> "a" in my_set
True
集合不允许你使用切片或类似的方法来访问set的单个成员。相反,您需要迭代一个set。你可以使用一个循环来完成,比如一个while循环或者一个for循环。
在本文中,您不会深入讨论循环,但是下面是使用for循环迭代集合的基本语法:
>>> for item in my_set:
... print(item)
...
c
a
b
这将循环遍历set中的每一项,一次一项,并将其打印出来。
时代的变化
一旦创建了一个set,您就不能更改它的任何项目。
但是,您可以向set添加新项目。让我们来看看是如何做到的!
添加项目
向set添加项目有两种方式:
add()update()
让我们尝试使用add()添加一个项目:
>>> my_set = {"a", "b", "c", "c"}
>>> my_set.add('d')
>>> my_set
{'d', 'c', 'a', 'b'}
那很容易!您可以通过将项目传递给add()方法来将它添加到set中。
如果您想一次添加多个项目,那么您应该使用update()来代替:
>>> my_set = {"a", "b", "c", "c"}
>>> my_set.update(['d', 'e', 'f'])
>>> my_set
{'a', 'c', 'd', 'e', 'b', 'f'}
注意update()将接受你传递给它的任何 iterable。例如,它可能需要一个list、tuple或另一个set。
移除项目
您可以用几种不同的方式从器械包中移除物品。
您可以使用:
remove()discard()pop()
让我们在接下来的小节中逐一查看!
使用。移除()
remove()方法将尝试从set中移除指定的项目:
>>> my_set = {"a", "b", "c", "c"}
>>> my_set.remove('a')
>>> my_set
{'c', 'b'}
如果您碰巧向set到remove()询问一个不存在的项目,您将收到一个错误:
>>> my_set = {"a", "b", "c", "c"}
>>> my_set.remove('f')
Traceback (most recent call last):
Python Shell, prompt 208, line 1
builtins.KeyError: 'f'
现在让我们看看密切相关的discard()方法是如何工作的!
使用。丢弃()
discard()方法的工作方式与remove()几乎完全相同,它将从set中删除指定的项目:
>>> my_set = {"a", "b", "c", "c"}
>>> my_set.discard('b')
>>> my_set
{'c', 'a'}
与discard()的不同之处在于,如果你试图移除一个不存在的项目,它不会抛出错误:
>>> my_set = {"a", "b", "c", "c"}
>>> my_set.discard('d')
>>>
如果您希望能够在尝试移除不存在的项目时捕捉到错误,请使用remove()。如果你不介意,那么discard()可能是更好的选择。
使用。流行()
pop()方法将从set中移除并返回任意一项:
>>> my_set = {"a", "b", "c", "c"}
>>> my_set.pop()
'c'
>>> my_set
{'a', 'b'}
如果您的器械包是空的,并且您试图pop()取出物品,您将收到一条错误消息:
>>> my_set = {"a"}
>>> my_set.pop()
'a'
>>> my_set.pop()
Traceback (most recent call last):
Python Shell, prompt 219, line 1
builtins.KeyError: 'pop from an empty set'
这与pop()处理list数据类型的方式非常相似,除了对于list,它将引发一个IndexError。列表是有序的,而集合是无序的,所以你不能确定你会用pop()删除什么,因为集合是无序的。
清除或删除集合
有时候你会想清空一个set甚至完全移除它。
要清空一个set,可以使用clear():
>>> my_set = {"a", "b", "c", "c"}
>>> my_set.clear()
>>> my_set
set()
如果你想完全删除set,那么你可以使用 Python 的内置del:
>>> my_set = {"a", "b", "c", "c"}
>>> del my_set
>>> my_set
Traceback (most recent call last):
Python Shell, prompt 227, line 1
builtins.NameError: name 'my_set' is not defined
现在,让我们学习一下您还可以用器械包做什么!
集合操作
器械包为您提供了一些常见的操作,例如:
union()-合并两个集合并返回一个新集合intersection()-返回两个集合中相同元素的新集合difference()-返回一个新的set,其元素不在另一个set中
这些操作是您在使用sets时最常用的操作。
union()方法实际上有点像你之前学过的update()方法,因为它将两个或更多的集合组合成一个新的集合。但是,不同之处在于它返回一个新的集合,而不是用新项目更新原始集合:
>>> first_set = {'one', 'two', 'three'}
>>> second_set = {'orange', 'banana', 'peach'}
>>> first_set.union(second_set)
{'two', 'banana', 'three', 'peach', 'orange', 'one'}
>>> first_set
{'two', 'three', 'one'}
在本例中,您创建了两个集合。然后在第一个集合上使用union()来添加第二个集合。然而union并没有更新set。它创建了一个新的set。如果你想保存新的set,那么你应该改为执行以下操作:
>>> united_set = first_set.union(second_set)
>>> united_set
{'two', 'banana', 'three', 'peach', 'orange', 'one'}
intersection()方法接受两个集合并返回一个新的set,它只包含两个集合中相同的项目。
让我们看一个例子:
>>> first_set = {'one', 'two', 'three'}
>>> second_set = {'orange', 'banana', 'peach', 'one'}
>>> first_set.intersection(second_set)
{'one'}
这两个集合只有一个共同点:字符串“one”。因此,当您调用intersection()时,它会返回一个新的set,其中只有一个元素。与union()一样,如果您想要保存这个新的set,那么您会想要做这样的事情:
>>> intersection = first_set.intersection(second_set)
>>> intersection
{'one'}
difference()方法将返回一个新的集合,该集合中的元素是另一个集合中的而不是。这可能有点令人困惑,所以我们来看几个例子:
>>> first_set = {'one', 'two', 'three'}
>>> second_set = {'three', 'four', 'one'}
>>> first_set.difference(second_set)
{'two'}
>>> second_set.difference(first_set)
{'four'}
当您在first_set上调用difference()时,它返回一个以“two”作为其唯一元素的set。这是因为“two”是唯一没有在second_set中找到的字符串。当你在second_set上调用difference()时,它会返回“四”,因为“四”不在first_set中。
还有其他方法可以用于集合,但是它们很少被使用。如果你需要使用这些方法,你应该去查阅文档以获得关于这些方法的全部细节。
包扎
集合是一种很好的数据类型,用于非常特殊的情况。您会发现集合对于删除重复列表或元组最有用,或者通过使用它们来查找多个列表之间的差异。
在本文中,您了解了以下内容:
- 创建一个
set - 访问
set成员 - 时代的变化
- 添加项目
- 移除项目
- 删除一个
set
任何时候你需要使用类似集合的操作,你都应该看看这个数据类型。然而,很有可能,您会更频繁地使用列表、字典和元组。