目录
一、字典的表亲:集合
Python的字典是对数学中映射概念支持的直接体现。字典有个表亲:集合
>>> num = {}
>>> type(num)
<class 'dict'>
>>> num2 = {1,2,3,4,5}
>>> type(num2)
<class 'set'>
在Python中,如果用大括号括起一堆数字但没有体现映射关系,Python就会认为这堆玩意就是个集合
集合的作用:
>>> num2 = {1,2,3,4,5,4,3,2}
>>> num2
{1, 2, 3, 4, 5}
上面的例子可以看出:集合会把大括号里重复的数据自动清理掉。集合是无序的,它不支持索引,所以不能去索引集合中的某个元素
>>> num2[2]
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
num2[2]
TypeError: 'set' object does not support indexing
二、创建集合
创建集合有两种方法:一种是直接把一堆元素用大括号{}括起来;另一种是用set()
>>> set1 = set([1,2,3,4,5,5])
>>> set1
{1, 2, 3, 4, 5}
现在要去掉列表中重复的元素。如果没有学过集合的时候,可以这么写:
>>> num1 = [1,2,3,4,5,4,3,2,0]
>>> type(num1)
<class 'list'>
>>> temp = []
>>> for each in num1:
if each not in temp:
temp.append(each)
>>> temp
[1, 2, 3, 4, 5, 0]
学习了集合之后,可以这么说:
>>> num1 = list(set(num1))
>>> num1
[0, 1, 2, 3, 4, 5]
上面的例子中,set()创建的集合内部是无序的,再调用list()将无序的集合转换成列表,就是不能保证原来的列表顺序了(这里Python好心办坏事,把0放在最前面了)。所以如果关注列表中元素的前后顺序问题,在使用set()时候就要提高警惕了
三、访问集合
集合中的元素是无序的,不能像序列那样用下标进行访问,可以通过使用迭代把集合中的数据一个个读取出来
>>> set1 = {1,2,3,4,5,4,3,2,1,0}
>>> for each in set1:
print(each,end=' ')
0 1 2 3 4 5
当然也可以使用in或not in判断一个元素是否在集合中:
>>> 1 in num2
True
>>> '1' in num2
False
add()方法为集合添加元素,remove()方法删除集合中已知的元素:
>>> num2
{1, 2, 3, 4, 5}
>>> num2.add(6)
>>> num2
{1, 2, 3, 4, 5, 6}
>>> num2.remove(6)
>>> num2
{1, 2, 3, 4, 5}
四、不可变集合
有时候,我们希望集合中的元素具有稳定性,就是说,像元组一样不能随意的增加或者删除集合中的元素。那么我们可以使用frozenset()函数来定义不可变集合:
>>> num3 = frozenset([1,2,3,4,5])
>>> type(num3)
<class 'frozenset'>
>>> num3.add(6)
Traceback (most recent call last):
File "<pyshell#33>", line 1, in <module>
num3.add(6)
AttributeError: 'frozenset' object has no attribute 'add'