零基础入门学习Python(第2版)
上QQ阅读APP看书,第一时间看更新

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(冰冻)起来: