python基本数据类型集合set操作
转:https://www.cnblogs.com/tina-python/p/5468495.html
一、集合的定义
set集合,是一个无序且不重复的元素集合。
集合对象是一组无序排列的可哈希的值,集合成员可以做字典中的键。集合支持用in和not in操作符检查成员,由len()内建函数得到集合的基数(大小), 用 for 循环迭代集合的成员。但是因为集合本身是无序的,不可以为集合创建索引或执行切片(slice)操作,也没有键(keys)可用来获取集合中元素的值。
二、集合的创建

- s = set()
- s = {11,22,33,44}
- *注:创建空集合时,只能用set(),如果用第二种方法s={},创建的实际上是一个空字典。
- s = {}
- print(type(s))
- <class 'dict'>


- a=set('boy')
- b=set(['y', 'b', 'o','o'])
- c=set({"k1":'v1','k2':'v2'})
- d={'k1','k2','k2'}
- e={('k1', 'k2','k2')}
- print(a,type(a))
- print(b,type(b))
- print(c,type(c))
- print(d,type(d))
- print(e,type(e))
- 执行结果如下:
- {'o', 'b', 'y'} <class 'set'>
- {'o', 'b', 'y'} <class 'set'>
- {'k1', 'k2'} <class 'set'>
- {'k1', 'k2'} <class 'set'>
- {('k1', 'k2', 'k2')} <class 'set'>

三、集合的功能
基本功能:
- 增加

- a=set('python')
- a.add('tina')
- print(a)
- b=set('python')
- b.update('tina')
- print(b)
- 执行结果如下:
- {'tina', 'o', 'p', 'n', 't', 'y', 'h'}
- {'o', 'i', 'p', 'a', 'n', 't', 'y', 'h'}
- ##################
- 由以上代码可以看出,add是单个元素的添加,而update是批量的添加。输出结果是无序的,并非添加到尾部。

- 删除(remove,discard,pop)

- c={'p', 'i', 'h', 'n', 'o', 'y', 't'}
- c.remove('p')
- print(c)
- c={'p', 'i', 'h', 'n', 'o', 'y', 't'}
c.discard('p')
print(c)
- c={'p', 'i', 'h', 'n', 'o', 'y', 't'}
c.pop()
print(c)
- 执行结果如下: {'i', 'h', 't', 'o', 'y', 'n'}
#####- 当执行c.remove('p','i')和c.discard('p','i')时,报错:TypeError: remove() takes exactly one argument (2 given),说明remove和discard删除元素时都只能一个一个的删,同add对应。
#################################################################################
remove,pop和discard的区别:
discard删除指定元素,当指定元素不存在时,不报错;
remove删除指定元素,但当指定元素不存在时,报错:KeyError。
pop删除任意元素,并可将移除的元素赋值给一个变量,不能指定元素移除。

- 清空
- c={'p', 'i', 'h', 'n', 'o', 'y', 't'}
- c.clear()
- print(c)
- 执行结果如下:
- set()
set的特有功能:

- s1 = {0}
- s2 = {i % 2 for i in range(10)}
- s = set('hi')
- t = set(['h', 'e', 'l', 'l', 'o'])
- print(s.intersection(t), s & t) # 交集
- print(s.union(t), s | t) # 并集
- print(s.difference(t), s - t) # 差集
- print(s.symmetric_difference(t), s ^ t) # 对称差集
- print(s1.issubset(s2), s1 <= s2) # 子集(被包含)
- print(s1.issuperset(s2), s1 >= s2) # 父集(包含)
- 执行结果如下:
- {'h'} {'h'}
- {'i', 'e', 'h', 'l', 'o'} {'i', 'e', 'h', 'l', 'o'}
- {'i'} {'i'}
- {'e', 'l', 'o', 'i'} {'e', 'l', 'o', 'i'}
- True True
- False False


- s = {11,22,33}
- t = {22,44}
- print(s.isdisjoint(t))#(disjoint脱节的,)即如果没有交集,返回True,否则返回False
- s.difference_update(t)#将差集覆盖到源集合,即从当前集合中删除和B中相同的元素
- print(s)
- 执行结果如下:
- False
- {33, 11}
- s = {11,22,33}
- t = {22,44}
- s.intersection_update(t)#将交集覆盖到源集合
- print(s)
- 执行结果如下:
- {22}
- s = {11,22,33}
- t = {22,44}
- s.symmetric_difference_update(t)#将对称差集覆盖到源集合
- print(s)
- 执行结果如下:
- {33, 11, 44}

四、集合的转换

- se = set(range(4))
- li = list(se)
- tu = tuple(se)
- st = str(se)
- print(li,type(li))
- print(tu,type(tu))
- print(st,type(st))
- 执行结果如下:
- [0, 1, 2, 3] <class 'list'>
- (0, 1, 2, 3) <class 'tuple'>
- {0, 1, 2, 3} <class 'str'>

五、练习题
寻找差异:哪些需要删除?哪些需要新建?哪些需要更新?

- # 数据库中原有
- 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 }
- }

注意:无需考虑内部元素是否改变,只要原来存在,新汇报也存在,就是需要更新

- del_dict = set(old_dict).difference(set(new_dict))
- add_dict = set(new_dict).difference(set(old_dict))
- update_dict = set(new_dict).intersection(set(old_dict))
- print(del_dict)
- print(add_dict)
- print(update_dict)
- 执行结果如下:
- {'#2'}
- {'#4'}
- {'#3', '#1'}


- #!/usr/bin/python
- # -*- coding:utf-8 -*-
- 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},
- }
- 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},
- }
- new_set = set()
- old_set = set()
- for i in new_dict:
- new_set.add(i)
- for j in old_dict:
- old_set.add(j)
- new_add = new_set.difference(old_set) #new_dict中有,old_dict中沒有
- old_del = old_set.difference(new_set) #old_dict中有,new_dict中沒有
- update = new_set.intersection(old_set) #old_dict和new_dict共同有的,需要把new_dict更新到old_dict中
- for k in new_add:
- old_dict[k] = new_dict[k] #將new_dict中新增的內容添加到old_dict中
- for v in old_del:
- del old_dict[v] #將old_dict中失效的內容刪除
- for m in update:
- old_dict[m] = new_dict[m] #把new_dict更新到old_dict中
- print(old_dict)

python基本数据类型集合set操作的更多相关文章
- python基础数据类型--集合(set)
python基础数据类型--集合(set) 集合是一个数学概念由一个或多个确定的元素所构成的整体叫做集合 集合中的三个特征 1.确定性(元素必须死可hash) 2.互异性(去重) 3.无序性(集合中的 ...
- Python基础-week03 集合 , 文件操作 和 函数详解
一.集合及其运算 1.集合的概念 集合是一个无序的,不重复的数据组合,它的主要作用如下 *去重,把一个列表变成集合,就自动去重了 *关系测试,测试两组数据之前的交集.并集.差集.子集.父级.对称差集, ...
- Python 基础之集合相关操作与函数和字典相关函数
一:集合相关操作与相关函数 1.集合相关操作(交叉并补) (1)intersection() 交集 set1 = {"one","two","thre ...
- python 基本数据类型以及运算符操作
一.基本数据类型 为何要区分类型? 数据类型的值是变量值得类型,变量值之所以区分类型,是因为变量的值 用来记录事物的状态,而事物的状态有不同的种类,对应着,也必须用不 用类型去区分它们. 1.数字类型 ...
- Python之路(第五篇) Python基本数据类型集合、格式化、函数
一.变量总结 1.1 变量定义 记录某种状态或者数值,并用某个名称代表这个数值或状态. 1.2 变量在内存中的表现形式 Python 中一切皆为对象,数字是对象,列表是对象,函数也是对象,任何东西都是 ...
- Python基本数据类型集合、格式化、函数
一.变量总结 1.1 变量定义 记录某种状态或者数值,并用某个名称代表这个数值或状态. 1.2 变量在内存中的表现形式 Python 中一切皆为对象,数字是对象,列表是对象,函数也是对象,任何东西都是 ...
- 【python 3】 集合方法操作汇总
基本数据类型 : set 集合(set)特点 : 无序 不能重复(自动去重) 用 {} 或 set()函数 来表示集合 空集合 : set() 1 name = {"江户部柯南", ...
- python对数据类型的相关操作
一.int的相关操作 int只有一个相关操作,bit_length() 用于计算一个数字的二进制长度 二.bool的相关操作 1.把数字转换成bool,除了0,返回的都是True a = 10 p ...
- python基本数据类型——集合
集合 无序可变序列,集合中元素不允许重复,即每个元素都是唯一的 集合中的元素按照升序排列 # 创建集合 >>aset = set([0,2,4,5,7,2,3,5,9,0]) >&g ...
随机推荐
- 1233: [Usaco2009Open]干草堆tower
传送门 感觉正着做不太好搞,考虑倒过来搞 容易想到贪心,每一层都贪心地选最小的宽度,然后发现 $WA$ 了... 因为一开始多选一点有时可以让下一层宽度更小 然后有一个神奇的结论,最高的方案一定有一种 ...
- RESET - 把一个运行时参数值恢复为缺省值
SYNOPSIS RESET name RESET ALL DESCRIPTION 描述 RESET 将运行时参数恢复为缺省值. RESET 是下面语句的一个变种 SET parameter TO D ...
- 04.Linux系统-Zabbix监控服务安装部署
一.环境准备 操作系统:CentOS_Server_7.5_x64_1804.iso 部署组件:Zabbix 二.操作步骤: Zabbix_Server安装部署 2.0.安装依赖组件 [root@lo ...
- linux的svn服务器搭建--Subversion Edge
linux下的collabnetsubversionedge的安装: 安装条件(运行环境) jdk + python + httpd 1.root用户下建立svnroot用户,及设定密码 userad ...
- java this的应用
package java04; /* * 当方法的局部变量和类的成员变量重名时,会根据“就近原则”,优先使用局部变量. * 如果需要访问奔雷中的成员变量,需要使用格式: this.成员变量名 * * ...
- Vue路由监听
一.问题描述 描述:页面1showowner.vue跳转到页面2showuser.vue 需求:页面1的多个结点对应于一个页面2文件[页面2未展示] 问题:并不是页面一的一个结点对应一个页面二文件 处 ...
- cassandra集群
cassandra是分布式数据库属于nosql,用于处理大量商用服务器上的大量数据,提供高可用性,无单点故障. Cassandra在其节点之间具有对等分布式系统,并且数据分布在集群中的所有节点之间. ...
- Codeforces Round #584 - Dasha Code Championship - Elimination Round (rated, open for everyone, Div. 1 + Div. 2)
怎么老是垫底啊. 不高兴. 似乎 A 掉一道题总比别人慢一些. A. Paint the Numbers 贪心,从小到大枚举,如果没有被涂色,就新增一个颜色把自己和倍数都涂上. #include< ...
- Hadoop中的排序和连接
MapReduce的全排序 主要是为了保证分区排序,即第一个分区的最后一个Key值小于第二个分区的第一个Key值 与普通的排序仅仅多一个自定义分区类MyPartitioner见自己所写的实验 (设置一 ...
- springBoot相关(一)
2.0新特性: 编程语言: Java8+.Kotlin 底层框架:Spring Framwork 5.0.x 全新特性: web Flux web Flux: 函数编程:java 8 Lambda 响 ...