1 集合和列表的区别

- 集合和列表非常相似
- 不同点:
    1.集合中只能存储不可变对象
    2.集合中存储的对象是无序(不是按照元素的插入顺序保存)
    3.集合中不能出现重复的元素

2 创建集合

2-1 使用 {} 来创建集合

>>> s = {10,3,5,1,2,1,2,3,1,1,1,1}
>>> s
{1, 2, 3, 5, 10}
>>> 
给出的集合是具有重复数字的集合,但是在输出后集合默认具有去重功能

2-2 使用 set() 函数来创建集合

>>> s = {[1,2,3],[4,6,7]}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
如上所示在使用大括号创建就不可以了,下面引出另一种集合的创建方法。

s = set() # 空集合
# 可以通过set()来将序列和字典转换为集合
>>> s = set([1,2,3,4,5,1,1,2,3,4,5])
>>> s
{1, 2, 3, 4, 5}
>>> 

# 使用set()将字典转换为集合时,只会包含字典中的键
>>> s = set({'a':1,'b':2,'c':3}) 
>>> s
{'c', 'b', 'a'}
>>> 

3 访问集合

由于集合是无序的所以无法像序列那样用下标进行访问,但是可以通过迭代进行取出集合中的元素。

1) 迭代访问
sets={1,2,3,4,5}
for each in sets:
    print(each)
输出:
    1
    2
    3
    4
    5

2) 使用in和not in来检查集合中的元素是否存在

>>> sets={1,2,3,4,5}
>>> sets
{1, 2, 3, 4, 5}
>>> 5 in sets
True
>>> 6 in sets
False

3) 使用len()来获取集合中元素的数量
>>> print(len(sets))
5
>>> 

4) add() 向集合中添加元素
>>> sets
{1, 2, 3, 4, 5}
>>> sets.add("helloworld")
>>> sets.add("hellopython")
>>> sets
{1, 2, 3, 4, 5, 'helloworld', 'hellopython'}
>>> 

5) update() 
将一个集合中的元素添加到当前集合中update()
可以传递序列或字典作为参数,字典只会使用键

>>> sets
{1, 2, 3, 4, 5, 'helloworld', 'hellopython'}
>>> sets.update(set('hello'))
>>> sets.update((10,20,30,40,50))
>>> sets.update({100:1,200:2,300:3,400:4,500:5})
>>> sets
{1, 2, 3, 4, 5, 200, 10, 400, 'hellopython', 20, 'l', 30, 'h', 100, 40, 300, 'helloworld', 50, 500, 'e', 'o'}
>>> 

6) remove()删除集合中的指定元素
>>> sets
{1, 2, 3, 4, 5, 200, 10, 400, 'hellopython', 20, 'l', 30, 'h', 100, 40, 300, 'helloworld', 50, 500, 'e', 'o'}
>>> sets.remove('hellopython')
>>> sets.remove("helloworld")
>>> sets
{1, 2, 3, 4, 5, 200, 10, 400, 20, 'l', 30, 'h', 100, 40, 300, 50, 500, 'e', 'o'}
>>> 


7) pop()随机删除并返回一个集合中的元素

这里随机选择从首元素或者尾元素开始。
>>> sets
{1, 2, 3, 4, 5, 200, 10, 400, 20, 'l', 30, 'h', 100, 40, 300, 50, 500, 'e', 'o'}
>>> sets.pop()
1
>>> sets.pop()
2
>>> sets.pop()
3
>>> sets
{4, 5, 200, 10, 400, 20, 'l', 30, 'h', 100, 40, 300, 50, 500, 'e', 'o'}
>>>

8) copy()对集合进行浅复制
>>> sets_copy=sets.copy()
>>> sets_copy
{4, 5, 200, 10, 400, 20, 'l', 30, 'h', 100, 40, 300, 50, 500, 'e', 'o'}
>>> sets
{4, 5, 200, 10, 400, 20, 'l', 30, 'h', 100, 40, 300, 50, 500, 'e', 'o'}
>>> 

9) clear()清空集合
  >>> sets
{4, 5, 200, 10, 400, 20, 'l', 30, 'h', 100, 40, 300, 50, 500, 'e', 'o'}
>>> sets.clear()
>>> sets
 {}
>>> 

4 不可变集合

有时候希望集合中的数据具有稳定性,也就是像元祖一样不能随意的增加和修改,那么就需要定义成不可变集合。这里使用frozenset() 函数。这里俗称把元素给冰冻起来了。

>>> sets=frozenset({1,2,3,4,5,6,7,8})
>>> sets
frozenset({1, 2, 3, 4, 5, 6, 7, 8})
>>> sets.add(9)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'frozenset' object has no attribute 'add'
>>> sets.remove(1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'frozenset' object has no attribute 'remove'
>>> 

5 集合的运算

# 在对集合做运算时,不会影响原来的集合,而是返回一个运算结果
# 创建两个集合
>>> sets1={1,2,3,4,5}
>>> sets2={3,4,5,6,7}

# & 交集运算
sets1和sets2共同的元素
>>> sets1 & sets2
{3, 4, 5}

# | 并集运算
sets1和sets2所有的元素
>>> sets1 | sets2
{1, 2, 3, 4, 5, 6, 7}
>>>

# - 差集
存在sets1中但是不存在sets2中
>>> sets1 - sets2
{1, 2}
>>> 

# ^ 异或集 
获取只在一个集合中出现的元素
>>> sets1 ^ sets2
{1, 2, 6, 7}
>>> 

# <= 
检查一个集合是否是另一个集合的子集
# 如果a集合中的元素全部都在b集合中出现,那么a集合就是b集合的子集,b集合是a集合超集
a = {1,2,3}
b = {1,2,3,4,5}

result = a <= b # True
result = {1,2,3} <= {1,2,3} # True
result = {1,2,3,4,5} <= {1,2,3} # False

# < 
检查一个集合是否是另一个集合的真子集
# 如果超集b中含有子集a中所有元素,并且b中还有a中没有的元素,则b就是a的真超集,a是b的真子集
result = {1,2,3} < {1,2,3} # False
result = {1,2,3} < {1,2,3,4,5} # True

# >= 检查一个集合是否是另一个的超集
# > 检查一个集合是否是另一个的真超集
评 论