文章目录

  • 一、集合
  • (一)基本使用
  • 1.用途
  • 2.定义
  • 3.需要掌握的操作类型及内置使用方法
  • (1)关系运算
  • (2)去重
  • 4.了解的操作类型及内置使用方法
  • (1)循环
  • (2)update()
  • (3)clear()
  • (4)pop()
  • (5)remove()
  • (6)discard()
  • (7)add()
  • (8)isdisjoint()
  • (二)该类型总结
  • 1.存值个数
  • 2.是否有序
  • 3.是否可变
  • (二)该类型总结
  • 1.存值个数
  • 2.是否有序
  • 3.是否可变


一、集合

(一)基本使用

1.用途

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

2.定义

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

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

# 注意2:{}既可以用于定义dict,也可以用于定义集合,但是字典内的元素必须是key:value的格式,现在我们想定义一个空字典和空集合,该如何准确去定义两者?
d = {} # 默认是空字典 
s = set() # 这才是定义空集合

类型转换:

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

3.需要掌握的操作类型及内置使用方法

一般集合常用的操作就是关系运算与去重,其他的操作都是不经常使用。

(1)关系运算

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

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

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

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

# 4.对称差集(^) # 求两个用户独有的好友们(即去掉共有的好友)
>>> friends1 ^ friends2
{'kevin', 'zero', 'ricky', '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
(2)去重

集合去重复有局限性

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

示例:

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

# 针对不可变类型,并且保证顺序则需要我们自己写代码实现,例如
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)
# 结果:既去除了重复,又保证了顺序,而且是针对不可变类型的去重
[
    {'age': 18, 'sex': 'male', 'name': 'lili'}, 
    {'age': 73, 'sex': 'male', 'name': 'jack'}, 
    {'age': 20, 'sex': 'female', 'name': 'tom'}
]

4.了解的操作类型及内置使用方法

(1)循环

集合可以使用for循环取值,但一般不使用。

s1 = {3, 2, 1}
for item in s1:
    print(item)  # 1  2   3  循环取值
(2)update()
s1 = {3, 2, 1}
print(id(s1))  # 1897107362976
s1.update({3,4,5})  # 接收集合或者任意可以转换成集合的数据
print(s1)  # {1, 2, 3, 4, 5}  集合实现了更新
print(id(s1))  # 1897107362976  # id不变,内容改变,是可变类型的数据
(3)clear()
(4)pop()

移除和返回一个任意集合元素,如果集合为空,则报错。

s1 = {3, 2, 1}
res = s1.pop()
print(s1)  # {2, 3}
print(res)  # 1 值可以返回
(5)remove()

指定删除集合中的一个元素,它必须是集合的成员,否则会报错。

s1 = {3333, "aaa", 222, "bbb", 111}
res = s1.remove(3333)
print(s1)  # {'bbb', 111, 'aaa', 222}
print(res)  # None  没有返回值
(6)discard()

指定删除集合中的一个元素,不是集合的成员也不会报错。

s1 = {3333, "aaa", 222, "bbb", 111}
res = s1.discard(3333)
print(s1)  # {'bbb', 111, 'aaa', 222}
print(res)  # None  没有返回值
(7)add()

给集合添加元素,如果元素已存在,也不会报错。

s1 = {3333, "aaa", 222, "bbb", 111}
s1.add(5555)
print(s1)  # {'aaa', 3333, 'bbb', 111, 5555, 222}
(8)isdisjoint()

如果两个集合没有共同的元素则返回True

s1 = {1, 2, 3}
s2 = {4, 5}
print(s1.isdisjoint(s2))  # True

(二)该类型总结

1.存值个数

集合类型可以存多个不重复、不可变类型的值

2.是否有序

集合是无序的

3.是否可变

set集合是可变类型

5, 222}

#### (8)isdisjoint() 

如果两个集合没有共同的元素则返回True

```python
s1 = {1, 2, 3}
s2 = {4, 5}
print(s1.isdisjoint(s2))  # True

(二)该类型总结

1.存值个数

集合类型可以存多个不重复、不可变类型的值

2.是否有序

集合是无序的

3.是否可变

set集合是可变类型