SET集合

set是一个无序且不重复的元素集合
创建集合:

name = set("aqwqewqa")

print(name)

result:

{'a', 'e', 'w', 'q'}

#移除
s1.discard(1) #元素存在直接移除 不存在不会报错
s1.remove(1) #元素存在直接移除,不存在会报错
s1.pop() #随机删除最后一个元素
s1 = set(["l","i","u"])
#add  添加集合元素
s1.add("huanqin")
print(s1)
#result : {'l', 'i', 'huanqin', 'u'}

# #clear 清空集合元素
s1.clear()
print(s1)
#result : set()

#copy 浅拷贝,只拷贝第一层数据
print(s1.copy())
#result : {'i', 'u', 'l'}

#difference 返回一个新的set s1中有,s2中没有的
s2 = set("iu")
s3 = s1.difference(s2)
print(s3)
# result:{'l'}

#difference_update 更改原有set,不返回一个新的, s1中有,s2中没有的
s2 = set("iu")
s1.difference_update(s2)
print(s1)
# result:{'l'}

#discard 移除集合元素
s1.discard("l")
print(s1)
# result:{'i', 'u'}

#intersection 取交集 重新生成一个set
s2 = set(["l","i"])
s3 = s1.intersection(s2)
print(s3)
# result:{'l', 'i'}

# intersection_update 修改原set
s2 = set(["l","i"])
s1.intersection_update(s2)
print(s1)
#result:{'l', 'i'}

#isdisjoint 是否有交集 无则返回True
s2 = set(["l","i"])
print(s1.isdisjoint(s2))
#result:False

#issubset 是否是子集
s2 = set(["l","i"])
print(s2.issubset(s1))  #判断s2是否是s1的子集
# result:True
print(s1.issubset(s2)) #判断s1是否是s2的子集
# result:False

#issuperset 是否是父集
s2 = set(["l","i"])
print(s2.issuperset(s1)) #判断s2是否是s1的父集
#result:False
print(s1.issuperset(s2)) #判断s1是否是s2的父集
#result:True

#pop 移除集合元素,默认移除最后一个
s1.pop()
print(s1)
# result:{'u', 'l'}

#remove 移除指定元素
s1.remove("l")
print(s1)
# result:{'u', 'i'}

#symmetric_difference 差集 会创建一个新的集合
s2 = set(["l","i"])
s3 = s1.symmetric_difference(s2)
print(s3)
# result:{'u'}

#symmetric_difference_update 差集 会修改原有集合
s2 = set(["l","i"])
s1.symmetric_difference_update(s2)
print(s1)
# result:{'u'}

#union 并集 创建一个新的对象
s2 = set(["h","u"])
s3 = s1.union(s2)
print(s3)
# result:{'u', 'h', 'i', 'l'}

#update 更新当前集合
s2 = set("hu")
s1.update(s2)
print(s1)
#result:{'h', 'u', 'l', 'i'}
set 集合
练习:
#数据库中原有
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 }
}
需求:获取最新报表
注意:无需考虑内部元素是否改变,只要原来存在,新汇报也存在,就是需要更新
思路:
1. 需要更新的列表 update_list
2. 需要删除的列表 del_list
3. 需要增加的列表 add_list
程序:
old_set = set(old_dict.keys())
new_set = set(new_dict.keys())
update_set = new_set.intersection(old_dict)
delete_set = old_set.difference(update_set)
add_set = new_set.difference(update_set)
print(update_set,delete_set,add_set)
#result:{'#3', '#1'} {'#2'} {'#4'}
练习程序demo

collection系列

计数器(counter)

需要进行模块功能导入: import collection

Counter是对字典类型的补充,用于追踪值的出现次数。

ps:具备字典的所有功能 + 自己的功能

c = Counter('abcdeabcdabcaba')
print c
输出:Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})
import collections
#Counter 统计字符出现个数,结果是字典类型
num = collections.Counter("qwererqewafda")
print(num)
#result:Counter({'e': 3, 'a': 2, 'q': 2, 'w': 2, 'r': 2, 'f': 1, 'd': 1})
for k,v in num.items():
    print(k,v)
# result:
# q 2
# d 1
# e 3
# f 1
# r 2
# w 2
# a 2

#most_common
print(num.most_common(4)) #出现次数最高的前四个,数量大于等n的所有元素和计数器
# result:[('e', 3), ('q', 2), ('r', 2), ('w', 2)]
for k in num.most_common(4):
    print(k)
# result:
# ('e', 3)
# ('w', 2)
# ('r', 2)
# ('q', 2)

#elements 输出计数器中的所有元素,注:此处非所有元素集合,而是包含所有元素集合的迭代器
for i in num.elements():
    print(i)
# result:
# w
# w
# q
# q
# f
# e
# e
# e
# r
# r
# d
# a
# a

#sorted 按照ascii码进行元素排序
print(sorted(num.elements()))
# result:['a', 'a', 'd', 'e', 'e', 'e', 'f', 'q', 'q', 'r', 'r', 'w', 'w']

# __missing__ 对于不存在的元素,返回计数器0
a = num.__missing__("h")
print(a)
#result: 0

# b= num["h"] #统计key的个数 若key不存在则返回0
print(b)
# result:0

#update 更新计数器,其实就是增加;如果原来没有,则新建,如果有则加一
num.update("asdf")
print(num)
# result:Counter({'e': 3, 'a': 3, 'w': 2, 'r': 2, 'q': 2, 'f': 2, 'd': 2, 's': 1})

#subtract 相减,原来的计数器中的每一个元素的数量减去后添加的元素的数量
num.subtract("asdf")
print(num)
# result:Counter({'e': 3, 'r': 2, 'q': 2, 'w': 2, 'a': 1, 'f': 0, 'd': 0, 's': -1})

#copy 浅拷贝
c = num.copy()
print(c)
#result:Counter({'e': 3, 'w': 2, 'a': 2, 'r': 2, 'q': 2, 'f': 1, 'd': 1})

#del 删除
del num["e"]
print(num["e"])
# result:0

#__delitem__ 删除元素
d = num.__delitem__("e")
print(num)
# result:Counter({'w': 2, 'q': 2, 'a': 2, 'r': 2, 'f': 1, 'd': 1})
counter

有序字典(orderedDict )

orderdDict是对字典类型的补充,他记住了字典元素添加的顺序

import collections
d = collections.OrderedDict({'name':'liu','age':18,'address':'beijing'})
# print(d)
print(type(d))
# result:
# OrderedDict([('age', 18), ('name', 'liu')])
# <class 'collections.OrderedDict'>

#move_to_end 将指定的键值移动到末尾
d.move_to_end("age")
print(d)
# result:OrderedDict([('adderss', 'beijing'), ('name', 'liu'), ('age', 18)])

#pop 删除key 但是会返回value
e = d.pop('address')
print(d) 删除k,v
print(e) value值
# result :
# OrderedDict([('name', 'liu'), ('age', 18)])
# beijing

#clear 清空有序字典的值
d.clear()
print(d)
#result:OrderedDict()

#keys,values,items
l1 = d.keys()
print(l1)
l2 = d.values()
print(l2)
l3 = d.items()
print(l3)
# result:
# odict_keys(['name', 'address', 'age'])
# odict_values(['liu', 'beijing', 18])
# odict_items([('name', 'liu'), ('address', 'beijing'), ('age', 18)])
orderedDict

 默认字典(defaultdict) 

defaultdict是对字典的类型的补充,他默认给字典的值设置了一个类型。

 练习有如下值集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。

即: {'k1': 大于66 'k2': 小于66}
from collections import defaultdict

values = [11, 22, 33,44,55,66,77,88,99,90]

my_dict = defaultdict(list)

for value in  values:
    if value>66:
        my_dict['k1'].append(value)
    else:
        my_dict['k2'].append(value)
练习程序demo

可命名元组(namedtuple) 

根据nametuple可以创建一个包含tuple所有功能以及其他功能的类型。

import collections
MytupleClass = collections.namedtuple("MytupleClass",['x','y','z'])
xyz = MytupleClass(11,22,33)
print(xyz.x,xyz.y,xyz.z)
#result:11 22 33

队列

queue.Queue,先进先出队列
queue.LifoQueue,后进先出队列
queue.PriorityQueue,优先级队列
queue.deque,双向对队

queue.Queue(2) 先进先出队列
put放数据,是否阻塞,阻塞时的超时时间
get取数据(默认阻塞),是否阻塞,阻塞时的超时时间
队列的最大长度
qsize()真实个数
maxsize 最大支持的个数
jion,task_done,阻塞进程,当队列中任务执行完毕后,不再阻塞

先进先出(Queue)

#先进先出
# import queue
# q = queue.Queue(2)          #先进先出
# print(q.empty()) #True
# q.put(11)
# q.put(22)
# print(q.empty()) #False
# print(q.qsize()) #2
# q.put(22)
# q.put(33,block=False)
# q.put(33,block=False,timeout=2)

# print(q.get())
# print(q.get())
# print(q.get(timeout=2))

# import queue
# q = queue.Queue(5)
# q.put(123)
# q.put(456)
# q.get()
# q.task_done()
# q.join()
先进先出

后进先出队列(LifoQueue)

#后进先出
import queue
q = queue.LifoQueue()     #后进先出
q.put(123)
q.put(456)
print(q.get()) #456
后进先出队列

优先级处理队列(PriorityQueue)

#根据优先级处理
import queue
q = queue.PriorityQueue() #根据优先级处理
q.put((1,"lhq1"))
q.put((1,"lhq2"))
q.put((1,"lhq3"))
q.put((3,"lhq3"))
print(q.get()) #(1, 'lhq1')
优先级处理

双向队列(deque)

一个线程安全的双向队列

 创建双向队列引入collections

import collections
d = collections.deque()
返回结果:<class 'collections.deque'>

创建单向队列 引入queue

#创建单向队列
import queue
q = queue.Queue()
print(type(q))
#<class 'queue.Queue'>

 文件操作

打开文件 

注:python中打开文件有两种方式,即:open(...) 和  file(...) ,本质上前者在内部会调用后者来进行文件操作,推荐使用 open

打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作。

打开文件的模式有:

  • r,只读模式(默认)。
  • w,只写模式。【不可读;不存在则创建;存在则删除内容;】
  • a,追加模式。【可读;   不存在则创建;存在则只追加内容;】

"+" 表示可以同时读写某个文件

  • r+,可读写文件。【可读;可写;可追加】
  • w+,写读
  • a+,同a

"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用 

  • rU
  • r+U

"b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)

  • rb
  • wb
  • ab
# close(self)    关闭文件
#
# fileno(self)    文件描述符
#
# flush(self)    刷新文件内部缓冲区
#
# isatty(self)    判断文件是否是同意tty设备
#
# next(self)    获取下一行数据,不存在,则报错
#
# read(self, size=None)    读取指定字节数据
#
# readinto(self)    读取到缓冲区,不要用,将被遗弃
#
# readline(self, size=None)    仅读取一行数据
#
# readlines(self, size=None)    读取所有数据,并根据换行保存值列表
#
# seek(self, offset, whence=None)    指定文件中指针位置
#
# tell(self)    获取当前指针位置
#
# truncate(self, size=None)     截断数据,仅保留指定之前数据
#
# write(self, p_str)    写内容
#
# writelines(self, sequence_of_strings)    将一个字符串列表写入文件
#
# xreadlines(self)    可用于逐行读取文件,非全部
#seek&&tell
f =open("test.log","w")
f.write("qwewqreasdf")
f =open("test.log","r+")
set = f.read(2)#指定读取字符
print(set)
print(f.tell()) #通过字节来计算
# result:
# qw
# 2
f.seek(2) #指定指针位置
f.truncate() #截断数据,仅保留指定之前数据
f.close() 
seek,read,tell,truncate