【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()这样的方法来操作数据了。
【Python】 更多数据类型collections&简易数据文件shelve的更多相关文章
- python递归、collections系列以及文件操作进阶
global log 127.0.0.1 local2 daemon maxconn log 127.0.0.1 local2 info defaults log global mode http t ...
- Python处理json格式的数据文件(一些坑、一些疑惑)
这里主要说最近遇到的一个问题,不过目前只是换了一种思路先解决了,脑子里仍然有疑惑,只能怪自己太菜. 最近要把以前爬的数据用一下了,先简单的过滤一下,以前用scrapy存数据的时候为了省事也为了用一下它 ...
- python 压缩每周生成的数据文件
为了便于整理部分业务数据,以及存储管理, 写了此脚本.后期如果有需求,再改一下. #!/usr/bin/env python #coding:utf8 import os,sys,time,comma ...
- python 解析Hdfs上的数据文件
python想直接读取hadoop上的文件内容,一番操作,头发掉了几根,也没能解析出来parquet文件类型的文件. 本博文简单讲解一下TEXTFILE文件格式的解析: 需要安装模块hdfs from ...
- 利用Python读取外部数据文件
不论是数据分析,数据可视化,还是数据挖掘,一切的一切全都是以数据作为最基础的元素.利用Python进行数据分析,同样最重要的一步就是如何将数据导入到Python中,然后才可以实现后面的数据分析.数 ...
- 两分钟解决Python读取matlab的.mat数据
Matlab是学术界非常受欢迎的科学计算平台,matlab提供强大的数据计算以及仿真功能.在Matlab中数据集通常保存为.mat格式.那么如果我们想要在Python中加载.mat数据应该怎么办呢?所 ...
- python读取数据文件:pandas包详解
本文转载自https://blog.csdn.net/brucewong0516/article/details/79092579 pandas包是一个高效的文件读取工具,适用于txt,excel,等 ...
- Python读取和处理文件后缀为".sqlite"的数据文件
最近在弄一个项目分析的时候,看到有一个后缀为”.sqlite”的数据文件,由于以前没怎么接触过,就想着怎么用python来打开并进行数据分析与处理,于是稍微研究了一下. SQLite是一款非常流行的关 ...
- 笔记——malloc、free、不同数据类型操作、.pyc文件、python安装第三方包、验证一个网站的所有链接有效性
C — malloc( ) and free( ) C 语言中使用malloc( )函数申请的内存空间,为什么一定要使用free释放? **malloc()函数功能:是从堆区申请一段连续的空间,函数结 ...
随机推荐
- 放大倍数超5万倍的Memcached DDoS反射攻击,怎么破?
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 作者:腾讯游戏云 背景:Memcached攻击创造DDoS攻击流量纪录 近日,利用Memcached服务器实施反射DDoS攻击的事件呈大幅上 ...
- SQL中partition关键字的使用
最近在写后台语句时候,运用到了partition这样一个关键字. 先大致说一下背景,有一种数据表,如下 现在需要取出,每一个人最近的一次打卡时间. 思路是,先把数据按照人名分组,然后在每个组里面按照时 ...
- Android项目中的换肤总结
纵观现在各种Android app,其换肤需求可以归为 白天/黑夜主题切换(或者别的名字,通常2套),如同花顺/自选股/天天动听等,UI表现为一个switcher. 多种主题切换,通常为会员特权,如Q ...
- 【linux】linux下能ping通ip 但是不能ping通域名
经过一翻查找后解决了,原因和方法如下: [root@~]# grep host /etc/nsswitch.conf#hosts: db files nisplus nis dnshosts: ...
- 引导加载程序之争: LILO 和 GRUB
在不考虑他们的工作或专业情况下,所有 Linux 用户都会使用的是哪个工具?引导加载程序.通过本文了解引导加载程序的工作原理,认识两个流行的引导加载程序 LILO(LInux LOader)和 GNU ...
- hdu2262 Where is the canteen
Where is the canteen Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot ...
- C#技术点--修改系统时间
C#的System.DateTime类提供了对日期时间的封装,用它进行时间的转换和处理很方便,但是我没有在其中找到任何可以用来修改系统时间的成员.用过VC.VB等的朋友可能知道,我们可以调用Win32 ...
- Linux之23个重要命令
作为工作几年的Linux运维老司机,总结了Linux命令行的常用的一些用法,希望对您有所收获. 1. 搜索 在vi和vim中如果打开一个很大的文件,不容易找到对应的内容,可以使用自带的搜索关键字进行搜 ...
- hive查询结果输出到hdfs上
insert overwrite directory "/mapredOutput/UserYesterdayInterest/${hiveconf:day}"row format ...
- 实例 centos自动挂载、备份windows共享文件夹,并删除第7日前当天的备份
此为用户twk的备份执行方案(192.168.42.246虚拟机数据库,备份到192.168.42.147的第二硬盘)此为用户twk的备份执行方案(192.168.42.5虚拟机数据库,备份到192. ...