集合

集合

作用

集合、list、tuple、dict一样都可以存放多个值,但是结合主要用于:驱虫、关系运算。

定义

"""
定义:在{}内用逗号分隔开多个元素,集合具备一下三个特点:
	1: 每个元素必须是不可变类型
	2: 集合内没有重复的元素
	3: 集合内元素无序
"""

# 注意1: 列表类型是索引对应值,字典是key对应值,均可以取得单个指定的值,而集合类型既没有索引也没有key与值对应,所以无法取得单个的值,而且对于集合来说,主要用于去重与关系运算,根本没有取出单个指定值这种书需求。

# 注意2: {}既可以用于定义字典dict,也可以用定义集合set,但是字典内的元素必须是key:value的格式,定义空字典和空集合是要注意区别:
d = {}  # 默认是空字典
s = set()  # 这才是定义集合

类型转换

# 但凡能被for循环遍历的数据类型(强调:遍历出的每一个值都必须为不可变类型)都可以传给set()
>>> s = set([1,2,3,4])
>>> s1 = set((1,2,3,4))
>>> s2 = set({'name':'jason', 'age':18})
>>> s3 = set('egon')
>>> s, s1, s2, s3
({1, 2, 3, 4}, {1, 2, 3, 4}, {'name', 'age'}, {'g', 'n', 'o', 'e'})

使用

关系运算

定义两个集合friends1与friends2来分别存放两个人的好友名字,然后以这个两个集合为例讲解集合的关系运算

>>> friends1 = {"zero","kevin","jason","egon"}  # 用户1的好友们
>>> friends2 = {"Jy","ricky","jason","egon"}  # 用户2的好友们

两个集合关系如下图所示

![image-20210422192729548](/Users/admin/Library/Application Support/typora-user-images/image-20210422192729548.png)

# 1.合集/并集(|):求两个用户所有的好友(重复好友只留一个)
>>> friends1 | friends2
{'kevin', 'jason', 'zero', 'Jy', 'egon', 'ricky'}

# 2.交集(&):求两个用户的共同好友
>>> friends1 & friends2
{'egon', 'jason'}

# 3.差集(-)
>>> friends1 - friends2  # 求用户1独有的好友
{'kevin', 'zero'}
>>> friends2 - friends1  # 求用户2独有的好友
{'ricky', 'Jy'}

# 4.对称差集(^) 求两个用户独有的好友们(即去掉共同好友)
>>> friends2 ^ friends1
{'kevin', 'ricky', 'zero', 'Jy'}

# 5.值是否相等(==)
>>> friends1 == friends2
False

# 6.父集:一个集合是否包含另外一个集合
# 6.1 包含则返回True
>>> {1, 2, 3} > {1, 2}
True
>>> {1, 2, 3} >= {1, 2}
True
# 6.2 不存在包含关系,则返回False
>>> {1, 2, 3} > {1, 3, 4, 5}
False
>>> {1, 2, 3} >= {1, 3, 4, 5}
False

# 7.子集
>>> {1, 2} < {1, 2, 3}
True
>>> {1, 2} <= {1, 2, 3}
True

去重

集合去重复有局限性

# 1. 只能针对不可变类型
# 2. 集合本身是无序的,去重之后无法保留原来的顺序

示例如下

>>> l = ['a', 'b', 1, 'a', 'a']
>>> s = set(l)
>>> s  # 将列表转成了集合
{1, 'a', 'b'}
>>> l_new = list(s)  # 再将集合换回列表
>>> l_new
[1, 'a', 'b'] # 去掉了重复,但是打乱了顺序

# 针对不可变类型,并且保证顺序则需要自己写代码实现,例如
>>> l=[ 
...     {'name':'lili','age':18,'sex':'male'},
...     {'name':'jack','age':73,'sex':'male'},
...     {'name':'tom','age':20,'sex':'female'},
...     {'name':'lili','age':18,'sex':'male'},
...     {'name':'lili','age':18,'sex':'male'},
... ]
>>> new_l = []
>>> for dic in l:
...     if dic not in new_l:
...             new_l.append(dic)
... 
>>> print(new_l)
# 结果:既去除了重复,又保证了顺序,而且是针对不可变类型的去重
[
    {'name': 'lili', 'age': 18, 'sex': 'male'}, 
    {'name': 'jack', 'age': 73, 'sex': 'male'}, 
    {'name': 'tom', 'age': 20, 'sex': 'female'}
]

其他操作

# 1.长度
>>> s = {'a','b','c'}
>>> len(s)
3

# 2.成员运算
>>> 'c' in s
True

# 3.循环
>>> for item in s:
...     print(item)
... 
c
a
b

练习

"""
一.关系运算
  有如下两个集合,pythons是报名python课程的学员名字集合,linuxs是报名linux课程的学员名字集合
  pythons={'jason','egon','kevin','ricky','gangdan','biubiu'}
  linuxs={'kermit','tony','gangdan'}
  1. 求出即报名python又报名linux课程的学员名字集合
  2. 求出所有报名的学生名字集合
  3. 求出只报名python课程的学员名字
  4. 求出没有同时这两门课程的学员名字集合
"""
# 求出即报名python又报名linux课程的学员名字集合
>>> pythons & linuxs
# 求出所有报名的学生名字集合
>>> pythons | linuxs
# 求出只报名python课程的学员名字
>>> pythons - linuxs
# 求出没有同时这两门课程的学员名字集合
>>> pythons ^ linuxs

posted @ 2021-05-07 11:27  hduxycblog  阅读(74)  评论(0)    收藏  举报