collections 模块: 在内置数据类型(dict、list、set、tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter、deque、defaultdict、namedtuple和OrderedDict等。 1.namedtuple: 生成可以使用名字来访问元素内容的tuple 2.deque: 双端队列,可以快速的从另外一侧追加和推出对象 3.Counter: 计数器,主要用来计数 4.OrderedDict: 有序字典 5.defaultdict: 带有默认值的字典 collections 模块给你提供的就是一些特殊的数据类型. namedtuple:生成可以使用名字来访问元素内容的tuple
tu = (1,2) print(tu[0],tu[1]) from collections import namedtuple point = namedtuple('Point',['x','y']) p = point(10,30) # p = (x=10,y=30) print(p.x) print(p.y) print(p[0]) print(p[1])
deque 双向队列:
from collections import deque q = deque(['a','b','c','d','e']) print(q) q.append(666) #添加最右边 q.append(777) q.appendleft(111) #从最左边添加 q.appendleft(222) q.pop() # 从右边删除 q.popleft() # 从左边删除 q.popleft() print(q)
queue队列 原则:先进先出.fifo (first in first out) 栈: 先进后出
dic = {} dic['name'] = 'alex' dic['age'] = '1000' dic['sex'] = '男' print(dic)
Counter :计数器,主要用来计数
Counter类的目的是用来跟踪值出现的次数。它是一个无序的容器类型,以字典的键值对形式存储,其中元素作为key,其计数作为value。计数值可以是任意的Interger(包括0和负数)。Counter类和其他语言的bags或multisets很相似。
from collections import Counter c = Counter('abcdeabcdabcaba') print(c) 输出:Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})
OrderedDict:有序字典
创建字典:
from collections import OrderedDict od = OrderedDict() od['name'] = 'alex' od['age'] = '1000' od['sex'] = '男' print(od) 高级版:(不常用) d = dict([('a', 1), ('b', 2), ('c', 3)]) print(d) from collections import OrderedDict od1 = OrderedDict([('a', 1), ('c', 3), ('b', 2),]) print(od1)
defaultdict: 带有默认值的字典 有如下值集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。 即: {'k1': 大于66 , 'k2': 小于66}
l1 = [11,22,33,44,55,77,88,99,90] dic = {} for i in l1: if i > 66: if 'key1' not in dic: dic['key1'] = [] dic['key1'].append(i) else: if 'key2' not in dic: dic['key2'] = [] dic['key2'].append(i) print(dic)
from collections import defaultdict l1 = [11, 22, 33,44,55,66,77,88,99,90] my_dict = defaultdict(list) for value in l1: if value>66: my_dict['k1'].append(value) else: my_dict['k2'].append(value) print(my_dict)
习题:
dic1 = {} #---> dic1={1:5,2:5,3:5.....20:5}
方法1: for i in range(1,21): dic1[i] = 5 print(dic1) 方法2: dic1 = {x:5 for x in range(1,21)} 方法3: dic1 = dict.fromkeys(range(1,21),5) 方法4: dic1 = defaultdict(lambda :5) for i in range(1,21): dic1[i] print(dic1) from collections import Counter c = Counter('abcdeabcdabcabafkjdslajlkfd') print(c)
random 模块: import random 随机 import random print(random.random()) # 0~1 之间的小数 print(random.uniform(1,3)) # 1~3小数 print(random.randint(1,5)) # 1<=x<=5 print(random.randrange(1,10,2)) # 1<=x<10 的奇数 顾首不顾尾 print(random.choice({1,'23',2,3})) #报错,必须是字符串 print(random.choice('fdsjafdsfgdsagfdsa')) # 任选一个 常用 print(random.sample([1,1,1,1,1,6,7,8,9,10],2)) # #列表元素任意2个组合
item = [i for i in range(1,14)] random.shuffle(item) # 打乱顺序 print(item) #对列表内容打乱
生成随机验证码:
import random def v_code(): code = '' for i in range(5): num=random.randint(0,9) alf=chr(random.randint(65,90)) add=random.choice([num,alf]) code="".join([code,str(add)]) return code print(v_code())
collections模块 可命名元组,默认字典,有序字典 可命名元组 namedtuple 在内置数据类型(dict、list、set、tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter、deque、defaultdict、namedtuple和OrderedDict等。 1.namedtuple: 生成可以使用名字来访问元素内容的tuple(坐标相关) 2.deque: 双端队列,可以快速的从另外一侧追加和推出对象(原则:先进先出, fifo(first in first out) 3.Counter: 计数器,主要用来计数 4.OrderedDict: 有序字典 5.defaultdict: 带有默认值的字典 扩展数据类型的——模块 数据类型 int str float list tuple dict set
namedtuple:生成可以使用名字来访问元素内容的tuple
t = (2018,5,21,17,28,20,107,1) from collections import namedtuple struct_time = namedtuple('tuple_time', ['year','month','mday', 'hour','min','sec','yday','wday']) t1 = struct_time(2018,5,21,17,28,20,107,1) print(t1.year) print(t1.wday)
deque:双端队列,可以快速的从另外一侧追加和推出对象 使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,插入和删除效率很低。 deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈: import queue #并发编程 数据容器——list dict tuple 秩序 先进先出 FIFO--队列
import queue(队列) q = queue.Queue() # 创建队列 q.put(1) q.put(2) q.put('a') q.put([1,23]) print(q) 黑盒 print(q.get()) print(q.get()) 双向队列 from collections import deque dq = deque() dq.append(1) dq.append(2) dq.append('a') print(dq) print(dq.pop()) namedtuple d = dict([('a',1),('b',2),('c',3)]) print(d)
Counter:计数器
Counter类的目的是用来跟踪值出现的次数。它是一个无序的容器类型,以字典的键值对形式存储,其中元素作为key,其计数作为value。计数值可以是任意的Interger(包括0和负数)。Counter类和其他语言的bags或multisets很相似。
from collections import Counter c = Counter('abcdeabcdabcaba') print c 输出:Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})
OrderedDict: 有序字典
使用dict时,Key是无序的。在对dict做迭代时,我们无法确定Key的顺序。
如果要保持Key的顺序,可以用OrderedDict:
from collections import OrderedDict odic = OrderedDict([('a',1),('b',2),('c',3)]) print(odic)
defaultdict默认字典: 给字典设置一个默认值(callble),从此以后查看或者操作这个字典中的key, 不管这个key是否存在,都有一个对应的value默认值 有如下值集合 [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) print(my_dict)
使用dict时,如果引用的Key不存在,就会抛出KeyError。如果希望key不存在时,返回一个默认值,就可以用defaultdict: 时间换空间 空间换时间 from collections import defaultdict ddic = defaultdict(lambda :5)#设置这个字典的默认的value是一个列表 print(ddic) print('-->',ddic['a']) print(ddic) 有序字典:在字典中维护了一个永远不变的先后顺序。
random 模块: import random 随机小数: 发红包 random.random() #大于0且小于1之间的小数 print(random.random()) random.uniform(1,3) #大于1小于3的小数 print(random.uniform(1,3)) 随机整数: 抽奖 验证码 彩票 import random random.randint(1,5)#大于等于1且小于等于5之间的整数 头尾都顾 不能设置步长 print(random.randint(1,5)) random.randrange(1,10,2)#大于等于1且小于10之间的奇数 顾头不顾尾可设置步长 print(random.randrange(1,10,2)) 随机选择一个返回值:(可重复) random.choice([1,'23',[4,5]])#1或23或[4,5] 从一个可迭代对象中抽取一个值 随机选择多个返回,返回的个数为函数的第二个参数(不可重复) random.sample([1,'23',[4,5]],2)#列表元素任意两个组合[[4,5],'23'] 从一个可迭代对象中抽取n个值 打乱列表顺序:(在原列表的基础上打乱顺序的)
item = [1,3,5,7,9] random.shuffle(item) #打乱次序 print(item) [5,1,3,7,9] random.shuffle(item) print(item) [5,9,7,1,3]
例题:6位数字验证码:
import random s = '' for i in range(6): num = str(random.randint(0,9)) s += num print(s)
6位数字加字母验证码:
res = '' for i in range(6): num = str(random.randint(0,9)) al_num = random.randint(97,122) alpha = chr(al_num) res += random.choice([num,alpha]) print(res)
字母大小写:
res = '' for i in range(6): num = str(random.randint(0,9)) al_num = random.randint(97,122) al_num2 = random.randint(65,90) alpha = chr(al_num) alpha2 = chr(al_num2) res += random.choice([num,alpha,alpha2]) print(res)