• collections模块


    在内置数据类型(list ,tuple ,dict ,set)的基础上,collections提供了几个额外的数据类型:

      1. namedtuple: 生成可以使用名字来访问元素内容的tuple
      2. deque: 双端队列,可以快速的从另外一侧追加或取出元素
      3. OrderedDict: 有序字典
      4. defaultdict: 带有默认值的字典
      5. Counter: 计数器,主要用来计数

    namedtuple:    命名元组/有名元组

    主要用于描述一类东西,这类东西都有相同的特征

    from collections import namedtuple
    res = namedtuple('name',['x','y','z'])          # ‘name’ 就是 元组名    []里面就是元组的 元素
    ret = res(2,3,4)            #传参  一一对应
    print(ret)              # name(x=2, y=3, z=4)
    print(ret.x)            # 2
    print(ret.y)            # 3
    print(ret.z)            # 4

    deque    双端队列

    先说一下,Python还有个queque模块,支持Queue()单向队列:

    import queue
    
    q = queue.Queue()       
    print(q.empty())                # 判断Queue()队列是否为空,    返回True,就是空
    #True 
    
    q = queue.Queue(1)     
    q.put(1)
    print(q.full())     #判断Queue()队列是否满了
    #True           
    
    q = queue.Queue()    
    q.put(1)
    q.put(2)
    q.put('a')
    q.put('b')
    print(q.get())          # 1     先进先出 FIFO:first in first out
    print(q.get())          # 2
    print(q.get())          # 3
    print(q.get())          # 4
    # print(q.get())        #4个元素,取了5次值,空了,get不到,就一直等待,程序不结束
    print(q.get_nowait())  # 报错 queue.Empty  get不到就停止并报错

    list的线性存储
    列表查询很快:索引查询
    列表插入操作就费时间了:线性存储
      线性存储:往列表中插入一个元素,插入位置后面的所有元素位置都要变化

    双端队列:

    打个比喻:list列表的append()方法,在后面尾巴添加,很快,不存在线性存储的问题,而双端对列就相当于有两个尾巴(无头),前面后面都可以append()

    from collections import deque
    dq = deque()
    dq.append(1)
    dq.append(2)
    dq.appendleft('a')
    dq.appendleft('b')
    print(dq)               #deque(['b', 'a', 1, 2])
    print(dq.pop())         # 2 从后面取值
    print(dq.popleft())     # b 从前面(左)取值

    OrderedDict     有序字典

    排列有序:

    from collections import OrderedDict
    dic = dict([('a', 1), ('b', 2), ('c', 3)])      #创建字典的另一种方法
    print(dic)
    # {'a': 1, 'c': 3, 'b': 2}     dict的Key是无序的
    
    od = OrderedDict(    [  ('a', 1), ('b', 2), ('c', 3)  ]    )
    print(od)
    #([('a', 1), ('b', 2), ('c', 3)])     OrderedDict的Key是有序的

    取值顺序:

    from collections import OrderedDict
    od = OrderedDict()
    od['a'] = 1
    od['b'] = 2
    od['c'] = 3
    print(od.keys())        #有序字典取值:  先进先出
    #odict_keys(['a', 'b', 'c'])   

    defaultdict:     默认字典 (默认值)

    使用原生字典时,如果引用的key不存在,就会返回一个KeyError: ,如果想key不存在时,返回一个默认值,就用defaultdict

    示例:

    values = [11, 22, 33,44,55,66,77,88,99,90]      #把大于66和小于66的元素分别放到字典的两个key中
    my_dic = {}
    for i in values:
        if i > 66:
            if 'k1' in my_dic:      # 需要先判断key是不是存在
                my_dic['k1'].append(i)
            else:my_dic['k1'] = [i]     # 如果不存在,还要先创建列表
        elif i < 66:
            if 'k2' in my_dic:
                my_dic['k2'].append(i)
            else:my_dic['k2'] = [i]
    print(my_dic)
    #{'k2': [11, 22, 33, 44, 55], 'k1': [77, 88, 99, 90]}

    如果使用默认字典  defaultdict

    from collections import defaultdict
    #my_dic1 = defaultdict([])   #用了一个空列表TypeError: first argument must be callable or None
    my_dic1 = defaultdict(list)     #如果key不存在,默认返回一个空列表
    for i in values:
        if i > 66:
            my_dic1['k1'].append(i)
        elif i < 66:
            my_dic1['k2'].append(i)
    print(my_dic1)
    #defaultdict(<class 'list'>, {'k2': [11, 22, 33, 44, 55], 'k1': [77, 88, 99, 90]})

    Counter   计数器

    跟踪值出现的次数.
    是一个 无序的 容器类型
    以字典的键值对形式存储 元素(key):次数(value)

    from collections import Counter
    c = Counter('abcdeabcdabcaba')
    print(c)
    # 输出:Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})
  • 相关阅读:
    快速理解平衡二叉树、B-tree、B+tree、B*tree
    centos 7(6) linux系统安装 mysql5.7.17(glibc版)
    关于使用Hibernate+spring+dubbo的实现微服务对象查询
    Keepalived+Nginx实现高可用(HA)
    Nginx源码安装
    Keepalived安装与配置
    单点fastDfs+centos7搭建
    Dubbo+zookeeper使用方法以及注意事项
    mac 下 iterm2 不能使用 rz sz
    java 无符号整型
  • 原文地址:https://www.cnblogs.com/zhzhlong/p/9278141.html
Copyright © 2020-2023  润新知