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‘}  #最终的结果

  

				
时间: 2024-08-19 10:52:10

03_set集合的相关文章

数组、字符串、集合

数组与集合的转换.数组与字符串的转换 ========数组变集合 String[] arr = {"abc","cc","kkkk"}; //把数组变成list集合有什么好处? /* 可以使用集合的思想和方法来操作数组中的元素. 注意:将数组变成集合,不可以使用集合的增删方法. 因为数组的长度是固定. contains. get indexOf() subList(); 如果你增删.那么会产生UnsupportedOperationExcepti

C#语言中数组和集合

数组.集合→用于储存多个同类型的数据数组 定长→用于保存固定数量的数据 在功能上,数组能实现的所有功能,集合都能实现:反之,集合能实现的某些功能,数组难以实现 占用内存少 便利速度快集合 不定长→保存的数据数量,可以在程序的执行过程中,发生变化 占用内存多 便利速度慢课时六:数组和集合 数组.集合→用于储存多个同类型的数据 数组 定长→用于保存固定数量的数据 在功能上,数组能实现的所有功能,集合都能实现:反之,集合能实现的某些功能,数组难以实现 占用内存少 便利速度快 集合 不定长→保存的数据数

通过反射了解集合泛型的本质

通过反射了解集合泛型的本质 import java.lang.reflect.Method; import java.util.ArrayList; /** * 通过反射了解集合泛型的本质 * @author shm * */ public class MethodDemo02 { public static void main(String[] args) { ArrayList list = new ArrayList(); list.add("hello"); list.add(

Java 之集合

collection(单列集合) List(有序,可重复) ArrayList     底层数据结构是数组,查询快,增删慢,线程不安全,效率高 Vector     底层数据结构是数组,查询快,增删慢,线程安全,效率低 LinkedList  底层数据结构是链表,查询慢,增删快,线程不安全,效率高 Set(无序,唯一) HashSet   底层数据结构是哈希表,依赖hashCode()和equals() 执行顺序:判断hashCode()是否相同,相同继续执行equals(),返回true不添加

集合和三元运算符

一.三元运算符 如下判断可以使用三元运算更方便的实现: a = 1b = 2 if a > 1: c = aelse: c = b 和下面是一样的: a = 1b = 2#下面这个c = a if a>1 else b 如下两种方法也是一样的:方式一: s=[]nums = list(range(1,11))for i in nums: if i%2==0: s.append(i)print(s)方式二:ss = [i for i in nums if i%2==0]print(ss)#这两种

集合函数 day4

1.集合 通过set强制转换,或者直接定义 1 nums = [0, 2, 4, 6, 8]#两种格式,带大括号与带中括号的 2 print(type(nums)) 3 aa = {0, 8, 2, 4, 6}#需要注意与字典的区别,字典是有分号的 2.交集

js算法集合(一) 水仙花数 及拓展(自幂数的判断)

js算法集合(一) ★ 最近有些朋友跟我说对js中的一些算法感到很迷惑,知道这个算法到底是怎么回事,但是就是不会用代码把它写出来,这里我跟大家分享一下做水仙花数的算法的思路,并对其扩展到自幂数的算法,希望能对大家有所帮助. 1.验证一个数是否为水仙花数 ①要写水仙花数的算法,我们首先来了解一下什么是水仙花数,水仙花数是指一个 3位正整数 ,它的每个位上的数字的 3次幂之和等于它本身.(例如:1^3 + 5^3+ 3^3 = 153): ②了解了什么是水仙花数我们就开始分析该怎么下手.通过定义来看

笔记:多线程-集合

阻塞队列(BlockingQueue) 当试图向队列添加元素而队列已满,或是想从队列移除元素而队列为空的时候,阻塞队列导致线程阻塞,阻塞队列接口定义如下,他继承Queue<E>接口: public interface BlockingQueue<E> extends Queue<E> { ????/** ???? * 添加一个元素,如果队列满,则抛出 IllegalStateException异常 ???? */ ????????boolean add(E e); ??

SQL入门之集合操作

尽管可以在与数据库交互时一次只处理一行数据,但实际上关系数据库通常处理的都是数据的集合.在数学上常用的集合操作为:并(union),交(intersect),差(except).对于集合运算必须满足下面两个要求: 两个数据集合必须具有同样数目的列 连个数据集中对应列的数据类型必须是一样的(或者服务器能够将其中一种类型转换为另一种类型) SQL语言中每个集合操作符包含两种修饰:一个包含重复项,另一个去除了重复项(但不一定去除了所有重复项). 0.union操作符 union和union all操作