把不同的元素组成一起形成集合,是python基本的数据类型。集合元素(set elements):组成集合的成员
python的set和其他语言类似, 是一个无序不重复元素集, 基本功能包括关系测试和消除重复元素. 集合对象还支持union(联合), intersection(交), difference(差)和sysmmetric difference(对称差集)等数学运算.
sets 支持 x in set, len(set),和 for x in set。作为一个无序的集合,sets不记录元素位置或者插入点。因此,sets不支持 indexing, slicing, 或其它类序列(sequence-like)的操作。
2.集合的创建
集合的使用
具体用法:
1.add(添加元素)
2.clear(清空集合)
3.copy(浅拷贝)
4.difference差异比较
5.difference_update差异更新
6.discard移除指定元素
7.intersection取交集并且建立新的集合
8.intersection_update取交集并且更新原来的集合
9.isdisjoint判断没有交集,没有返回true,有返回false
10.issubset判断是否为子集
11.issuperset判断是否为父集
12.pop移除集合元素
13.remove删除指定元素集合
14.symmetric_difference取两个集合的差集,并建立新的元素
15.symmetric_difference_update取两个集合的差集,更新原来的集合对象
16.union并集
17.update更新集合
案例:
二.collection系列
collections模块自Python 2.4版本开始被引入,包含了dict、set、list、tuple以外的一些特殊的容器类型,分别是:
OrderedDict类:排序字典,是字典的子类。引入自2.7。
namedtuple()函数:命名元组,是一个工厂函数。引入自2.6。
Counter类:为hashable对象计数,是字典的子类。引入自2.7。
deque:双向队列。引入自2.4。
defaultdict:使用工厂函数创建字典,使不用考虑缺失的字典键。引入自2.5。
使用的时候需要用import导入collections模块
1.计数器(counter)
Counter类的目的是用来跟踪值出现的次数。它是一个无序的容器类型,以字典的键值对形式存储,其中元素作为key,其计数作为value。计数值可以是任意的Interger(包括0和负数)。Counter类和其他语言的bags或multisets很相似。
(1)创建
创建一个空的Counter类
结果:
(2).计数值的访问
当所访问的键不存在时,返回0,而不是KeyError;否则返回它的计数。
(3).计数器的更新与减少
1.update()更新
2.subtract()减少
(4)键的删除
当计数值为0时,并不意味着元素被删除,删除元素应当使用del
(5) 迭代器
返回一个迭代器。元素被重复了多少次,在该迭代器中就包含多少个该元素。所有元素按照字母序排序,个数小于1的元素不被包含。
(5)most_common([n])
返回一个TopN列表。如果n没有被指定,则返回所有元素。当多个元素计数值相同时,按照字母序排列。
(6)浅拷贝
(7)算术与集合操作
+、-、&、|操作也可以用于Counter。其中&和|操作分别返回两个Counter对象各元素的最小值和最大值。需要注意的是,得到的Counter对象将删除小于1的元素。
一些Counter类的常用操作,来源于Python官方文档
2.有序字典(orderedDict )
有序字典继承字典的一切属性,只是在顺序上是有序的。
一些功能:
(1).move_to_end将指定的键值对从开头移动到末尾。
(2).pop删除字典键值,返回删除的键值的values
(3).clear清除有序字典的值
3.默认字典(defaultdict)
这里的defaultdict(function_factory)构建的是一个类似dictionary的对象,其中keys的值,自行确定赋值,但是values的类型,是function_factory的类实例,而且具有默认值。比如default(int)则创建一个类似dictionary对象,里面任何的values都是int的实例,而且就算是一个不存在的key, d[key] 也有一个默认值,这个默认值是int()的默认值0.
defaultdict是对字典的类型的补充,他默认给字典的值设置了一个类型。创建一个默认字典,value值类型为列表.dic = collections.defaultdict(list)
例:
defaultdict可以接受一个内建函数list作为参数。其实呢,list()本身是内建函数,但是再经过更新后,python里面所有东西都是对象,所以list改编成了类,引入list的时候产生一个类的实例。
一些具有的方法:
1.copy拷贝
4.可命名元组(namedtuple)
没有现成的类,用户需要自行创建相应的类
5.双向队列(deque)
(1)创建一个队列
(2)追加元素到队列
(3)追加元素到队列左侧
(4)统计元素个数
(4)清除
(5)extend扩展元素
(6)extendleft从左侧扩展
(7)pop删除
(8)popleft从左侧开始删除
(9)reverse顺序反转
(10)remove删除指定元素
(11)rotate将队列末尾4个元素反转到队列左侧
6.单向队列 queue(先进先出 FIFO )
(1)创建
queue.Queue类即是一个队列的同步实现。队列长度可为无限或者有限。可通过Queue的构造函数的可选参数maxsize来设定队列长度。如果maxsize小于1就表示队列长度无限。
(3)放入任务
调用队列对象的put()方法在队尾插入一个项目。put()有两个参数,第一个item为必需的,为插入项目的值;第二个block为可选参数,默认为
1。如果队列当前为空且block为1,put()方法就使调用线程暂停,直到空出一个数据单元。如果block为0,put方法将引发Full异常。
(3)从队列中取值
调用队列对象的get()方法从队头删除并返回一个项目。可选参数为block,默认为True。如果队列为空且block为True,get()就使调用线程暂停,直至有项目可用。如果队列为空且block为False,队列将引发Empty异常。
(3)返回队列大小
(4)判断队列为空返回True,反之False
(5)q.full() 如果队列满了,返回True,反之False
q.full 与 maxsize 大小对应
其他方法:
三.深浅拷贝
1.为什么要拷贝?
当进行修改时,想要保留原来的数据和修改后的数据
2.数字字符串 和 集合 在修改时的差异? (深浅拷贝不同的终极原因)
3.对于集合,如何保留其修改前和修改后的数据?
在内存中拷贝
4.对于集合,如何拷贝其n层元素同时拷贝?
深拷贝
1.对于 数字 和 字符串 而言,赋值、浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址。
例:
2.对于字典、元祖、列表 而言,进行赋值、浅拷贝和深拷贝时,其内存地址的变化是不同的。
赋值,只是创建一个变量,该变量指向原来内存地址,如:
(3)浅拷贝,在内存中只额外创建第一层数据
(4)深拷贝,在内存中将所有的数据重新创建一份(排除最后一层,即:python内部对字符串和数字的优化)