zoukankan      html  css  js  c++  java
  • 【Python】 更多数据类型collections&简易数据文件shelve

    【collections】

      collections在python内建的数据类型基础上新增一些实用的数据类型,其目的在于增加代码的可读性?(虽然我自己没怎么用过。。)

    ■  deque 双端队列

      q = deque([....]) 传入某个iterable对象给deque的构造方法,使得其变为一个双端队列。双端队列,顾名思义就是可以从队首和队尾进行加减元素操作的队列类型

      除了常见的序列方法如append,pop等,deque还可以用:

      q.appendleft(..)  在队伍左边append元素

      q.popleft()  在队伍左边pop掉一个元素

      q.rotate(位数)  让每个元素向移动指定位数,出了右边界就回到左边

      当然,用完deque操作之后可以用list()把它转化回一个列表或者其他办法转化为其他原生的序列

      

    ■Counter 计数器

      c = Counter(...)  同样也是传递一个iterable对象

      其返回的,也就是这个c,它是一个类字典数据类型,其key是参数iterable对象中的所有元素(去除重复的),而相应value是各元素出现的次数

      顾名思义,它做的工作就是将一个iterable对象做一个count的动作喽

      需要注意的是:

        1. c本身不是一个真的字典,print c 的时候出现的是类似于 Counter({'a':2,'b':2,'c':3})

        2. c[..]という方法で访问value时,若key不存在,会返回0(意义是这个key在Counter中出现了0次)。这一点和字典的d[..]以及d.get(..)都不一样,这两个情况当key不存在时前者报错后者返回None

      Counter的一些方法:

        ●  c.update(d),c.substract(d)

        d可以是个字典或者另一个Counter对象,方法旨在将d的统计结果从c加上或减去。

        update和字典的update类似,但是,当d中有key重复出现时,update的时候只取其value最大的情况。如c = Counter({'a':1}); c.update({'a':1,'a':2})的话,最终c = Counter({'a':3})而不是4

        若substract时c中某元素的计数小于d中的情况,那么该元素的计数值会变成0甚至负数,而元素作为key本身是不会消失的。

          c.elements()

        返回一个迭代器,其内容相当于是字典的d.keys()内含所有元素。当元素在Counter中的值小于等于0则其不出现在迭代器中。

        Counter({'a':1,'b':0}).elements() ===> ['a']

          c.most_common(n)

        返回一个列表,每一项为一个元组,共n个。元组里分别是元素和次数,方法给出的是出现频率最高的n个元素。

          用c += Counter() 可以移除当前c中所有次数为0或负数的项

    ■ defaultdict 带默认值的字典

      当字典创建或者要增加新的键值对的时候,如果key之前不存在,就会报KeyError,用defaultdict可以解决这个小问题

      令d = defaultdict(函数名) 这样在d[key]没找到key的时候这个key会被自动创建出来并且被设成默认值which是函数名指定函数的返回值,这个函数通常可以写int,str,list等等,也可自己定义.比如int的话默认返回值就是0,str的话就是空字符串""等等

      如此,在新增key之前就不用检查其是否存在了

      //在dict中也有dic.get(key,0)来指定当不存在key时指定默认值的做法,是和这个类似的。

    ■ OrderedDict 记住顺序的字典

      OrderedDict并不是说这种字典会排序,实际上字典排序可以用sorted(keys=func)这样的方法来做,这个OrderedDict的意思是说它会记住键值对增加的顺序

      但是初始化时就传入具体数据的话,没有传入顺序之分,OrderedDict也就管不了了,如:

    d = OrderedDict({'a':1,'b':2,'c':3})
    for k,v in d.items():
        print k,v
    
    >>>a 1
    c 3
    b 2
    ######这和传数据进去的顺序有关,而这个顺序是普通字典{'a':1,'b':2,'c':3}的顺序だから,所以OD是按照他的标准来的

      但是若数据是一条条传进去的话,下面这种情况:

    d['a'] = 1
    d['b'] = 2
    d['c'] = 3
    print d

      如果d是个普通字典,得到的会是{'a':1,'c':3,'b':2},而如d是个OrderedDict得到的会是OrderedDict({'a':1,'b':2,'c':3})

     ■  namedtuple

      namedtuple更像是一个“轻类”,可以在代码中临时创建出一个具有部分类以及类实例特征的东西,而不用class关键字等进行声明。其用法参考如下:

    from collections import namedtuple
    
    # 通过namedtuple相当于创建了一个名为User的轻类,带有属性name,age和sex
    User = namedtuple('User',['name','age','sex'])
    
    # 实例化一个user对象
    user = User('Frank',20,'male')
    
    # 获取对象的属性值
    print user.name
    
    # 获取对象内容
    print user
    # 输出为User(name="Frank",age=20,sex='male')

      之所以为轻类,通过namedtuple得到的这类“实例”,针对其属性,一般情况下增删查改中我们只有查的权限。如果你在上面写了类似于user.name = 'Takanashi'或者user.phone = 'xxx'都会报错。

      其实也不是完全不行,改可以通过user._replace(name='Takanashi')这样的方式来实现,不过需要注意其并不是真的修改了这个“实例”的属性,而是返回了一个修改后相同值的另一个“实例”(毕竟叫namedtuple,是个不可变类型,无法直接修改属性值)。

      另外还有类似于user._asdict()的方法将这个“实例”的各个属性和其值转换成OrderedDict键值对的形式。

    【shelve】

      其实这个模块没啥好讲的。。只不过它躺在我笔记本里面并且是我第一个写的大一点的python脚本里用到的

       shelve其实就是个能把字典的数据结构从内存里(动态的)转化到磁盘上的一个文件里(静态的),可以说是一个最最简单的数据库把。

        用法也很简单,database = shelve.open('path')来打开或者创建一个shelve文件

        之后就可以在程序中用类似于database['a'] = 1,database.keys()这样的方法来操作数据了。

  • 相关阅读:
    vue element-ui配置第三方图标库
    HTTP协议:状态码
    HTTP协议:无状态
    CDN:基础知识
    【转载】浅析机器视觉中的照明系统(该如何打光)
    nginx 端口转发
    Gitlab 备份 | 恢复 | 卸载 | 迁移 | 版本升级
    微信小程序支付服务端.net core实现,简单直接
    生产级gitlab备份
    背锅之旅:前任对我的爱-只备份不删除导致的磁盘爆满
  • 原文地址:https://www.cnblogs.com/franknihao/p/6533956.html
Copyright © 2011-2022 走看看