zoukankan      html  css  js  c++  java
  • collections模块---(namedtuple、deque、OrderdDict、defaultdict、Counter)和configparser模块

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

    deque、defaultdict、namedtuple 和OrderedDict等

    1 namedtuple:生成可以使用名字来访问元素的内容tuple

    2 deque:双端队列,可以快速的从另外一侧追加和推出内容

    3 Counter:计数器,主要用于计数

    4 OrderDict:有序字典

    5 defaultdict:带有默认值的字典

    一 namedtuple

    我们知道tuple表示不变集合,例如,一个点的二维坐标就可以表示成

    p=(1,2)

    为了使它更明确可以使用namedtuple

    from collections import namedtuple
    coordinate = namedtuple('Point',['x','y'])  # 定义一个namedtuple类型Point,并包含x,y属性。
    p = coordinate(1,2)  #创建一个p对象
    print(p) #Point(x=1,y=2)
    print(p.x)  # 获取x属性 1
    print(p.y)  # 获取y属性 2

    其中:Point的名字,可以随便定义,它不是关键字

    应用场景:time模块 ,面向对象进阶,纸牌游戏

    二 deque

    使用list存储数据时,按索引访问元素很快,但是插入和删除元素很慢,

    因为list是线性存储,数据量大的时候,插入和删除效率很低

    deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈:

    from collections import deque
    q=deque(['a','b','c'])
    q.append('x') #往后面追加一个元素
    q.appendleft('y') #往左边添加一个元素
    print(q) #deque(['y', 'a', 'b', 'c', 'x'])

    队列是有顺序的,如果需要用到增删改查,不适合用队列,场景:抢票,秒杀

    三 OrderedDict

    字典从3.5版本以后是有序的,这个功能在之前使用

    在3.5版本之前,key是无序的,可以使用OrederdDict

    注意,OrderedDict的Key会按照插入的顺序排列,不是Key本身排序

    >>> od = OrderedDict()
    >>> od['z'] = 1
    >>> od['y'] = 2
    >>> od['x'] = 3
    >>> od.keys() # 按照插入的Key的顺序返回
    ['z', 'y', 'x']

    四 defaultdict

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

    from collections import defaultdict
    
    values = [11, 22, 33,44,55,66,77,88,99,90]
    
    my_dict = defaultdict(list) #这样的话,后面每一个key都会对应一个空列表[]
    
    for value in  values:
        if value>66:
            my_dict['k1'].append(value)
        else:
            my_dict['k2'].append(value)

    使dict时,如果引用的Key不存在,就会抛出KeyError。如果希望key不存在时,返回一个默认值,就可以用defaultdict

    >>> from collections import defaultdict
    >>> dd = defaultdict(lambda: 'N/A')
    >>> dd['key1'] = 'abc'
    >>> dd['key1'] # key1存在
    'abc'
    >>> dd['key2'] # key2不存在,返回默认值
    'N/A'
    View Code

    五 Counter

    Counter类的目的是用来跟踪值出现的次数。它是一个无序的容器类型,以字典的键值对形式存储,其中元素作为key,其计数作为value。

    计数值可以是任意的Interger(包括0和负数)。Counter类和其他语言的bags或multisets很相似。

    c = Counter('abcdeabcdabcaba')
    print c
    输出:Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1}) #它统计了每一个元素的个数

    六configparser模块

    该模块适用于配置文件的格式与windows ini文件类似,可以包含一个或多个节(section),每个节可以有多个参数(键=值)。

    请看下面的文档

    [DEFAULT]
    serveraliveinterval = 45
    compression = yes
    compressionlevel = 9
    forwardx11 = yes
    
    [bitbucket.org]
    user = hg
    
    [topsecret.server.com]
    host port = 50022
    forwardx11 = no
    View Code

    要生成这样的文档该如果做

    import configparser
    
    config = configparser.ConfigParser()
    
    config["DEFAULT"] = {'ServerAliveInterval': '45',
                          'Compression': 'yes',
                         'CompressionLevel': '9',
                         'ForwardX11':'yes'
                         }
    config['bitbucket.org'] = {'User':'hg'}
    config['topsecret.server.com'] = {'Host Port':'50022','ForwardX11':'no'}
    
    with open('example.ini', 'w') as f:
       config.write(f)
    View Code

    可以看出节点的项,都变成小写了。当然default除外

    这是因为它在写入的时候,将所有字符串使用了lower()方法,转换为小写了

    下面我们开看看这个模块的增删改查

    import configparser
    config = configparser.ConfigParser()
    config.read('example.ini')
    print(config.sections()) #['bitbucket.org', 'topsecret.server.com'] default内容默认不显示
    #找出‘bitbucket.org’下所有的键值对
    # print(config.items('bitbucket.org'))
    #[('serveraliveinterval', '45'), ('compression', 'yes'), ('compressionlevel', '9'), ('forwardx11', 'yes'), ('user', 'hg')]
    
    # print(config.add_section('yuan')) #返回None ,文件里面也没有增加内容
    # config.write(open('example.ini','w')) #有了新内容
    #但是##############################
    #不能使用open('example.ini',w) 这个表示清空文件
    #config.write表示写入内容
    
    #那么删除一个节点呢
    # config.remove_section('bitbucket.org')
    # config.write(open('example.ini', "w")) # 写入文件
    
    #修改一个节点
    # config.set('yuan','k2','222')  # yuan节点增加项k2 = 222
    # config.write(open('example.ini', "w")) # 写入文件
    
    #现在让我们来查看一下
    for key in config['yuan']:  # 注意,有default时,会默认输出它的键
        print(key)
    '''
    k2
    serveraliveinterval
    compression
    compressionlevel
    forwardx11
    它会先输出自己的内容,然后加上default的内容,其他节点也一样
    '''
    #删除section下面的option
    config.remove_option('topsecret.server.com',"forwardx11")
    config.write(open('example.ini','w'))
    View Code
  • 相关阅读:
    【软件工程】软件测试目标定义 黑盒测试、白盒测试
    【计算机网络】互联网的组成(客户服务器、对等连接、电路交换、分组交换)
    【计算机网络】互联网概述
    文本域的宽度和高度应该用cols和rows来控制,还是 用width和height来控制
    javascript代码片段
    IE对象最后一个属性后不要加逗号,否则在IE7及以下版本中会报错
    检测IE浏览器方法
    Sublime Text 必备插件
    浅谈Javascript 中几种克隆(clone)方式
    JavaScript instanceof 运算符深入剖析
  • 原文地址:https://www.cnblogs.com/mmyy-blog/p/9287613.html
Copyright © 2011-2022 走看看