03_set集合

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了03_set集合相关的知识,希望对你有一定的参考价值。

set,无序,不重复序列

列表特点:有序,数据可重复

li = [11,222,11,222,]
print(li)
# 输出结果
# [11, 222, 11, 222]

a.创建 

集合:se = {"123", "456"} #每个值都是一个元素
字典:dic = {"k1":123} #键值对,字典的元素
列表:li = []  #python内部调用list()方法

 

初识构造方法
list((11,22,33,44))
原理:构造方法,类后加(),会自动执行这个类的__init__方法
自动执行list __init__ (构造方法)
内部执行for循环,循环元组里的所有元素(11,2,33,4),转换成列表[11,22,33,4]

 

创建集合

s1 = {11,22}
s2 = set() #创建空集合
s3 = set([11,22,33,4])

列表转换集合

li = [11,22,11,22]
s1 = set(li)
print(s1,type(s1))
# 输出结果:
{11, 22} <class ‘set‘>

 

操作集合

set()  #创建空集合
add()  #添加元素
clear()  #清除内容
copy()  #浅拷贝
difference()  #A中存在,B中不存在
difference_update()  #从当前集合中删除和B中相同的元素
discard()  #移除指定元素,不存在不报错
intersection()  #A,B的交集
intersection_update()  #取A,B的交集并更新到A中
isdisjoint()  #如果没有交集,返回True,否则返回False
issubset()  #是否是子集关系
pop()  #移除元素
remove()  #移除指定元素,不存在报错
symmetric_difference()  #对称差集
symmetric_difference_update()  #对称差集,并更新到A中
union()  #并集
update()  #更新

 示例1:创建set()、添加add()、清除clear()

s0 = set()  #创建集合
print(s0,type(s0))
s0.add(11)  #添加元素
s0.add(22)
s0.add(33)
s0.add(11)  #重复数据
print(s0,type(s0))
s0.clear()
print(s0,type(s0))

# 输出结果:3个print
# set() <class ‘set‘>
# {33, 11, 22} <class ‘set‘>
# set() <class ‘set‘>

示例2:移除元素pop(),discard(),remove()

s0 = set([11,22,33,44,55,])
print(s0, type(s0))
# {33, 11, 44, 22, 55} <class ‘set‘>
s0.pop()  #删除元素
print(s0)
# {11, 44, 22, 55}
s0.discard(11)  #指定删除11(存在)
print(s0)
# {44, 22, 55}
s0.discard(66)  #指定删除66(不存在,不报错)
print(s0)
# {44, 22, 55}
s0.remove(55)  #指定删除55(存在)
print(s0)
# {44, 22}
s0.remove(77)  #指定删除77(不存在,报错)
# KeyError: 77
print(s0)

示例3:交集、差集、并集、对称差集、子集

s1 = {11,22,33}
s2 = {22,33,44}
s3 = s1.difference(s2)  #s1中有,s2中没有的
print(s3)
# {11}
s4 = s2.difference(s1)  #s2中有,s1中没有的
print(s4)
# {44}
s5 = s1.symmetric_difference(s2) #对称差集,s1中有,s2中没有的和s2中有,s1中没有的集合
print(s5)
# {11, 44}
s6 = s1.intersection(s2)  #s1与s2的交集
print(s6)
# {33, 22}
s7 = s1.isdisjoint(s2)  #判断s1与s2是否有交集,没有返回True,否则False
print(s7)
# False
s8 = s2.issubset(s1)  #判断s2是否是s1的子集
print(s8)
# False
s9 = s1.union(s2)  #s1与s2的并集
print(s9)
# {33, 22, 11, 44}

示例4:更新

s1 = {11, 22, 33, }
print(s1)
# {33, 11, 22}
s1.update({55, 66, 77, })
print(s1)
# {33, 66, 22, 55, 11, 77}
s1.update("tom")
print(s1)
# {‘m‘, 33, 66, 22, 55, ‘o‘, ‘t‘, 11, 77} #更新数据为字符串时,每个字符为一个元素

示例5:集合更新

# s1、s2为两个set集合
s1 = {11, 22, 33, }
s2 = {22, 33, 44, }

s1.difference_update(s2)  #集合s1中删除和集合s2中相同的元素
print(s1)
# {11}

s1.intersection_update(s2)  #取s1和s2的集合,结果更新到s1
print(s1)
# {33, 22}

s1.symmetric_difference_update(s2)  #取s1与s2的对称差集,并将结果更新到s1中
print(s1)
# {11, 44}

 

练习:寻找差异

# 数据库中原有
old_dict = {
    "#1":{ ‘hostname‘:c1, ‘cpu_count‘: 2, ‘mem_capicity‘: 80 },
    "#2":{ ‘hostname‘:c1, ‘cpu_count‘: 2, ‘mem_capicity‘: 80 }
    "#3":{ ‘hostname‘:c1, ‘cpu_count‘: 2, ‘mem_capicity‘: 80 }
}
   
# cmdb 新汇报的数据
new_dict = {
    "#1":{ ‘hostname‘:c1, ‘cpu_count‘: 2, ‘mem_capicity‘: 800 },
    "#3":{ ‘hostname‘:c1, ‘cpu_count‘: 2, ‘mem_capicity‘: 80 }
    "#4":{ ‘hostname‘:c2, ‘cpu_count‘: 2, ‘mem_capicity‘: 80 }
}

思考:

需要删除的:old_dict有,new_dict中没有的key

需要增加的:new_dict有,old_dict中没有的key

需要更新的:old_dict中有,new_dict中也有key,而且在new_dict中值是有变化的

# 数据库中原有
old_dict = {
    "#1": { ‘hostname‘: "c1", ‘cpu_count‘: 2, ‘mem_capicity‘: 80 },
    "#2": { ‘hostname‘: "c1", ‘cpu_count‘: 2, ‘mem_capicity‘: 80 },
    "#3": { ‘hostname‘: "c1", ‘cpu_count‘: 2, ‘mem_capicity‘: 80 },
}

# cmdb 新汇报的数据
new_dict = {
    "#1":{ ‘hostname‘:  "c1", ‘cpu_count‘: 2, ‘mem_capicity‘: 800 },
    "#3":{ ‘hostname‘:  "c1", ‘cpu_count‘: 2, ‘mem_capicity‘: 80 },
    "#4":{ ‘hostname‘:  "c1", ‘cpu_count‘: 2, ‘mem_capicity‘: 80 },
}

# 设置old_dict里的key为集合
old_keys_set = set(old_dict.keys())
# old_keys_set = set(old_keys)
print("old_keys_set:", old_keys_set, type(old_keys_set))


# 设置new_dict里的key为集合
new_keys_set = set(new_dict.keys())
print("new_keys_set:", new_keys_set, type(new_keys_set))


# 筛选需要删除的key
remove_keys_set = old_keys_set.difference(new_keys_set)
print("remove_keys_set:", remove_keys_set, type(remove_keys_set))


# 筛选需要增加的key
add_keys_set = new_keys_set.difference(old_keys_set)
print("add_keys_set:", add_keys_set,type(add_keys_set))


# old_keys_set删除要删除的key
old_keys_set.difference_update(remove_keys_set)
# print(old_keys_set)
# old_keys_set增加要更新的key
old_keys_set = old_keys_set.union(new_keys_set)
print("old_keys_set", old_keys_set)



# 输出结果
old_keys_set: {‘#2‘, ‘#1‘, ‘#3‘} <class ‘set‘>  #数据库中原有的key
new_keys_set: {‘#4‘, ‘#1‘, ‘#3‘} <class ‘set‘>  #新数据中的key
remove_keys_set: {‘#2‘} <class ‘set‘>  #数据库中需要删除的key
add_keys_set: {‘#4‘} <class ‘set‘>  #数据库中需要增加的key
old_keys_set {‘#4‘, ‘#3‘, ‘#1‘}  #最终的结果

  

以上是关于03_set集合的主要内容,如果未能解决你的问题,请参考以下文章

python每日一练之集合set

2.5.1 集合操作

day03_02 集合操作

wk_03

集合03_Map

集合练习——Set部分