• python学习笔记 day19 常用模块


    1. collections模块:是跟python的扩展相关的模块

    1.namedtuple :---生成可以根据名字来取元素内容的元组

    from collections import namedtuple
    Point=namedtuple('point',['x','y','z'])   #namedtuple 第一个参数 是随便起的名字,后面是一个列表,用来存放属性名,之后就可以根据这个属性来取值
    point=Point(1,2,3)
    point2=Point(4,5,6)
    print(point.x)
    print(point.y)
    print(point.z)
    print(point2.x)
    print(point2.y)
    print(point2.z)

    运行结果:

     

    2.deque:双端队列:可以从左边增加元素,也可以从右边增加元素,当然取值的时候也可以从左边开始,也可以从右边开始~

    在讲deque双边队列之前先介绍队列queue的概念:

    我们知道堆栈:先进后出(杯子模型)

    队列(queue):先进先出,FIFO (排队取票)----从一端增加值,从另一端取值,绝对不可以从中间插入

    方法:put()----末尾增加元素;

              get()-----取出最头部的元素

    import queue
    q=queue.Queue()
    q.put(100)  # 往队列中添加元素
    q.put(200)
    while q.qsize():     # q.qsize()可以查看当前队列的长度
        print(q.get())   # q.get()可以从队列中取值,注意先放入的元素先取出

    运行结果:

    但是当队列中的元素值都已经取完之后,你再q.get() 不会报错,而是一直等着你给它放值(程序会一直停在那)这种现象又叫 阻塞

    deque(双向队列)-----就是可以同时从两边操作,两边都可以往队列中加值,也可以从队列中取值,所以又叫双端队列(而queue只能是一段增加值,另一端取值,所以才会有先进先出的概念)

    方法:append()----双向队列的尾部增加元素

               appendleft()---双向队列的头部增加元素

               pop()-----从双向队列的尾部取值

               popleft()-----从双向队列的头部取值

    from collections import deque
    q=deque()
    q.append(1)     # 给双向队列添加元素
    q.appendleft(2) # 从双向队列的左边添加元素
    q.insert(1,3)   # 从中间位置(1索引位置)添加元素
    print(q)        # 该双向队列的元素[2,3,1]
    print(q.pop())  # 返回双向队列的最右端值
    print(q.popleft())   #返回双向队列的最左端值

    运行结果:


    其实list在存储元素时按照索引去查找元素,效率是很高的,但是插入和删除操作效率很低,就是因为list是有序存储,插入和删除效率都很慢;

    而deque双端队列就是高效实现插入删除操作的双向列表,适用于栈和队列

    3.OrderedDict----有序字典

    普通字典dict是无序的,取出字典中的键是无序的,如果我们想让字典(中的key)有序,可以使用有序字典OrderedDicy 

    from collections import OrderedDict
    d1=dict([('a',1),('b',2),('c',3)])
    print(d1)   #此时的字典打印出来key就是无序的
    d2=OrderedDict([('a',1),('b',2),('c',3)])
    print(d2)
    for key in d2:   #此时挨个取有序字典中的key就是有序的~
        print(key)

    运行结果:

     

     其实字典相比于列表是要占内存的,有序字典相比于字典又要占内存。。。

     4. defaultdict---带有默认值的字典

    之前普通字典,当你查找字典中不存在的key时是会报错的(keyerror)但是默认字典不会~

    d=dict()  #普通字典
    print(d['k1'])   #会报错的

    运行结果:

    defaultdict带有默认值的字典就不会这样:需要给defaultdict()指定一个callable的类型,表示key对应的值value默认是该类型的

    说明:首先这个参数表示的是key对应的value

               其次这个参数必须是callable 类型,所以指定一个整数是不可以的!!

    from collections import defaultdict
    d=defaultdict(list)   #参数必须是callable类型的,比如这里就是list,代表key对应的默认值value=[] list类型的~
    print(d['k'])

    运行结果:


     

    a. 当参数不满足 callable时:

    from collections import defaultdict d=defaultdict(1) #参数必须是callable类型的,比如这里就是list,代表key对应的默认值value=[] list类型的~ print(d['k'])

    运行结果:


    b. 或者参数是这样也可以:

    from collections import defaultdict
    d=defaultdict(tuple)   #参数必须是callable类型的,比如这里就是list,代表key对应的默认值value=[] list类型的~
    print(d['k'])

    运行结果:


    c. 当然是一个定义的函数也行(函数是callable)

    from collections import defaultdict
    d=defaultdict(lambda:5)   #defaultdict()的参数传一个lambda函数也是可以的,该函数也callable lambda函数无参数,之返回一个5
    print(d['k'])    # 当字典中无key这个键时 会返回默认值5
    d['k1']=2       
    print(d['k1'])   # 字典中有k1 就会用自己的value
    print(d['k3'])   # 当字典中无key这个键时 会返回默认值5

    运行结果:

    d. 之前我们判断一个列表中大于66的值和小于66的值分别存放在字典不同的key中 是这样操作的:

    L=[32,45,56,67,78,89]
    dict={}  # 当然可以直接dict={'k1':[],'k2':[]}后面直接append()ok
    for i in L:
        if i>66:
            if 'k1' in dict:
                dict['k1'].append(i)
            else:
                dict['k1']=[i]
        else:
            if 'k2' in dict:
                dict['k2'].append(i)
            else:
                dict['k2']=[i]
    print(dict)

    运行结果:

    e. 但是有了defaultdict我们就可以设置默认值:

    from collections import defaultdict
    L=[32,45,56,67,78,89]
    d=defaultdict(list)
    for i in L:
        if i>66:
            d['k1'].append(i)
        else:
            d['k2'].append(i)
    print(d)
    print(d['k1'])
    print(d['k2'])

    运行结果:


    5.Counter---可以统计字符串中各自的数目

    from collections import Counter
    c=Counter('abcddcba,a,c,d,b,d,c,b,a')
    print(c)

    运行结果:

    其实collections模块就是跟python的扩展功能相关的,比如:

    tuple元组的扩展naedtuple(可以根据名字找元素);

    list列表的扩展双向队列deque(两边都可以进行增加元素,也都可以取出元素)

    dict 字典的扩展 有序字典OrderedDict 可以让key变得有序;

    dict 字典的扩展带有默认值的字典defaultdict 可以给字典中不存在的key设置一个默认值,但是参数必须是callable(比如list 或者 tuple 或者其他带有返回值的函数 lambda也可以~)

    talk is cheap,show me the code
  • 相关阅读:
    牌库读取的修复
    法术迸发(Spellburst)
    传染孢子的探索
    降低电脑功耗——降低笔记本风扇噪音
    Playfield 类方法的注释
    大陆争霸( 最短路变形)
    POJ 2406 Power String
    括号匹配
    HDU 1003 最大子段和
    6.19noip模拟赛总结
  • 原文地址:https://www.cnblogs.com/xuanxuanlove/p/9637854.html
Copyright © 2020-2023  润新知