- 零基础入门学习Python(第2版)
- 小甲鱼
- 814字
- 2021-03-24 14:53:34
7.2 集合:在我的世界里,你就是唯一

视频讲解
Python的字典是对数学中映射概念支持的直接体现,然而今天我们请来了字典的“表亲”:集合。
难道它们长得很像?来,大家看下代码:
>>> num1 = {} >>> type(num1) <class 'dict'> >>> num2 = {1, 2, 3, 4, 5} >>> type(num2) <class 'set'>
在Python 3里,如果用大括号括起一堆数字但没有体现出映射关系,那么Python就会认为这堆数据是一个集合而不是映射。
集合在Python中的最大特点就是两个字:唯一。
举个例子:
>>> num = {1, 2, 3, 4 ,5, 4, 3, 2, 1} >>> num {1, 2, 3, 4, 5}
大家看到,根本不需要额外做些什么,集合就会自动地将重复的数据删除,这样是不是很方便呢?但要注意的是,集合是无序的,也就是不能试图去索引集合中的某一个元素:

7.2.1 创建集合
创建集合有两种方法:一种是直接把一堆元素用大括号({})括起来;另一种是用set()内置函数。
>>> set1 = {"小甲鱼", "小鱿鱼", "小鲤鱼", "小甲鱼"} >>> set2 = set(["小甲鱼", "小鱿鱼", "小鲤鱼", "小甲鱼"]) >>> set1 == set2 True
现在要求去除列表[1, 2, 3, 4, 5, 5, 3, 1, 0]中重复的元素,如果还没有学习过集合,可能代码要这么写:

学习了集合之后,就可以这么写:
>>> list1 = [1, 2, 3, 4, 5, 5, 3, 1, 0] >>> list1 = list(set(list1)) >>> list1 [0, 1, 2, 3, 4, 5]
看,知识才是第一生产力!不过大家发现没有,由于set()创造的集合内部是无序的,所以再调用list()将无序的集合转换成列表就不能保证原来的列表顺序了(这里Python好心办坏事儿,把0放到最前面了),所以如果关注列表中元素的排序问题,那么在使用set()函数时就要提高警惕。
7.2.2 访问集合
由于集合中的元素是无序的,所以并不能像序列那样用下标来进行访问,但是可以使用迭代把集合中的数据一个个读取出来:

当然也可以使用in和not in判断一个元素是否在集合中已经存在:
>>> 0 in set1 True >>> 'oo' in set1 False >>> 'xx' not in set1 True
使用add()方法可以为集合添加元素,使用remove()方法可以删除集合中已知的元素:
>>> set1.add(6) >>> set1 {0, 1, 2, 3, 4, 5, 6} >>> set1.remove(5) >>> set1 {0, 1, 2, 3, 4, 6}
7.2.3 不可变集合
有时候希望集合中的数据具有稳定性,也就是说,像元组一样,不能随意地增加或删除集合中的元素。那么可以定义成不可变集合,这里使用的是frozenset()函数,就是把元素给frozen(冰冻)起来:
