Python 集合

集合

​ Python中的集合,类型是set。

​ 集合中的元素必须是可hash的,即只能存储不可变类型,但是集合本身又是可变类型,即可以对集合中的元素进行增删改查。

基本声明

集合中的元素必须是不可变类型。

​ 以下是使用类的形式进行声明:

s = set((1, 2, 3, 4, 5))
print("值:%s,类型%s" % (s, type(s)))
# 值:{1, 2, 3, 4, 5},类型<class 'set'>

​ 也可以选择使用更方便的字面量形式,使用{}对元素进行包裹,每个元素间用,进行分割:

s = {1, 2, 3, 4, 5}
print("值:%s,类型%s" % (s, type(s)))
# 值:{1, 2, 3, 4, 5},类型<class 'set'>

类型转换

​ 集合可以与bool、list、tuple、str等进行转换:

s = {1, 2, 3, 4, 5}
b_set = bool(s) # 布尔类型
str_set = str(s)  # 字符串类型
li_set = list(s)  # 字符串类型
tup_set = tuple(s)  # 字符串类型

print("值:%s,类型:%s"%(b_set,type(b_set)))
print("值:%s,类型:%s"%(str_set,type(str_set)))
print("值:%s,类型:%s"%(li_set,type(li_set)))
print("值:%s,类型:%s"%(tup_set,type(tup_set)))

# 值:True,类型:<class 'bool'>
# 值:{1, 2, 3, 4, 5},类型:<class 'str'>
# 值:[1, 2, 3, 4, 5],类型:<class 'list'>
# 值:(1, 2, 3, 4, 5),类型:<class 'tuple'>

使用方式

​ 集合更多的作用是来操纵数据,而并非存储数据。

​ 如何正确的使用集合?这就要利用到集合中去重的特性,如下示例中,我们想对list中的元素进行去重,就可以将其先转变为set后再转变成list:

l = [1, 2, 3, 2, 3, 3, 2, 1]
s = set(l)
l = list(s)
print(l)
# [1, 2, 3]

其他特性

​ 集合的元素都是进行hash存储。

​ 集合本身属于一种容器类型。

​ 集合的查找速度是非常快的。

​ 集合中元素的顺序不是有序的,而是无序的。

常用方法

​ 集合最重要的操作手法就是去重以及关系运算(求交差并集)

关系图解

img

符号操纵

​ 集合中关于关系的运算可以使用符号进行操纵:

# ==== set方法之关系运算(符号篇) ====

set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}

# -- 交集 --
print(set1 & set2)  # {4, 5}

# -- 差集 --
print(set1 - set2)  # {1, 2, 3}
print(set2 - set1)  # {8, 6, 7} 集合无序

# -- 合集/并集 --
print(set1 | set2)  # {1, 2, 3, 4, 5, 6, 7, 8}

# -- 对称差集 --
print(set1 ^ set2)  # {1, 2, 3, 6, 7, 8}

# -- 父级 --
set3 = {1, 2, 3, 4}
set4 = {1, 2}

print(set3 > set4)  # True
print(set3 >= set4)  # True

# -- 子级 --
print(set4 < set3)  # True
print(set4 <= set3)  # True

# ====== 两个集合相等 ======= 互为父子关系

方法操纵

​ 除开使用符号操纵,也可以使用方法进行操纵:

# ==== set方法之关系运算(方法篇) ====

set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}

# -- 交集 --
print(set1.intersection(set2))  # {4, 5}

# -- 差集 --
print(set1.difference(set2))  # {1, 2, 3}
print(set2.difference(set1))  # {8, 6, 7} 集合无序

# -- 合集/并集 --
print(set1.union(set2))  # {1, 2, 3, 4, 5, 6, 7, 8}

# -- 对称差集 --
print(set1.symmetric_difference(set2))  # {1, 2, 3, 6, 7, 8}

# -- 父级 --
set3 = {1, 2, 3, 4}
set4 = {1, 2}

print(set3.issuperset(set3))  # True

# -- 子级 --
print(set4.issubset(set3))  # True

# ====== 两个集合相等 ======= 互为父子关系

其他操作

​ 以下的操作都很少使用,了解即可:

# ==== set方法的其他操作 ====

# --- 去重 --- 不举例,这个是集合的特性。上两章举过例子了。

set5 = {1, 2}

set5.add(3)
print(set5)  # {1, 2, 3} add() 为集合中添加一个元素

set6 = set5.copy()  # copy() 浅拷贝
print(set5.pop())  # 从集合中随机弹出并删除元素(集合无序所以随机)。不可指定index(set不支持index)

set5.remove(2)  # 将指定元素从集合中删除。如果元素不存在集合中则抛出异常
print(set5)  # {3}

set5.discard(5)  # 同 remove(),但是如果元素不存在于集合中也不会抛出异常。

set5.clear()  # 清空集合
print(set5)  # set()

set5.update({1, 2, 3, 4, 5, 6, 7})  # 更新集合
print(set5)  # {1, 2, 3, 4, 5, 6, 7}

# 求出差集后赋值给set5 。(注意:单纯的difference只是生成新对象,并不会覆盖原值)
set5.difference_update({1, 2, 3, 4})
print(set5)  # {5, 6, 7}

print(set5.isdisjoint({"a,b,c"}))  # True 两个集合完全独立没有共同部分返回 True

set6 = frozenset({1, 2, 3, })  # 创建一个不可变的set。(可迭代对象)

注意事项

​ 由于集合中的元素必须是不可变类型,所以你不可以存入以下数据类型:

  1. 列表
  2. 字典
  3. 集合
posted @ 2020-10-18 22:06  云崖君  阅读(116)  评论(0)    收藏  举报