collections random模块

 

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])
View Code
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)
View Code
queue队列 原则:先进先出.fifo   (first in first out)

栈: 先进后出
dic = {}
dic['name'] = 'alex'
dic['age'] = '1000'
dic['sex'] = ''
print(dic)
View Code
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})
View Code
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)
View Code
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)
defaultdict字典解决方法:
习题:
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)
View Code
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())
View 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)
View Code
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)
View Code
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})
View Code
OrderedDict: 有序字典
使用dict时,Key是无序的。在对dict做迭代时,我们无法确定Key的顺序。
如果要保持Key的顺序,可以用OrderedDict:
from collections import OrderedDict
odic = OrderedDict([('a',1),('b',2),('c',3)])
print(odic)
View Code
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)
View Code
使用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]
View Code
例题:6位数字验证码
import random
s = ''
for i in range(6):
    num = str(random.randint(0,9))
    s += num
print(s)
View Code
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)
View Code
字母大小写:
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)
View Code

 

posted on 2018-07-09 20:55  liangliang123456  阅读(193)  评论(0编辑  收藏  举报

导航