在内置数据类型(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'

五 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

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

import configparser

config = configparser.ConfigParser()

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

可以看出节点的项,都变成小写了。当然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'))

collections模块---(namedtuple、deque、OrderdDict、defaultdict、Counter)和configparser模块的更多相关文章

  1. collections集合模块 [namedtuple,deque,*]

    collections是Python内建的一个集合模块,提供了许多有用的集合类. namedtuple namedtuple是一个函数, 它用来创建一个自定义的tuple对象,并且规定了 tuple元 ...

  2. python基础14 ---函数模块4(configparser模块)

    configparser模块 一.configparser模块 1.什么是configparser模块:configparser模块操作配置文件,配置文件的格式与windows ini和linux的c ...

  3. collections 数据结构模块namedtuple

    namedtuple类 导入模块 from collections import namedtuple 使用方法及说明 #pycharm 里按住 ctrl键点击 collections可查看源码 #c ...

  4. python 全栈开发,Day27(复习, defaultdict,Counter,时间模块,random模块,sys模块)

    一.复习 看下面一段代码,假如运行结果有问题,那么就需要在每一步计算时,打印一下结果 b = 1 c = 2 d = 3 a = b+c print(a) e = a + d print(e) 执行输 ...

  5. python模块collections中namedtuple()的理解

    Python中存储系列数据,比较常见的数据类型有list,除此之外,还有tuple数据类型.相比与list,tuple中的元素不可修改,在映射中可以当键使用.tuple元组的item只能通过index ...

  6. 常用模块(collections模块,时间模块,random模块,os模块,sys模块,序列化模块,re模块,hashlib模块,configparser模块,logging模块)

    认识模块 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编写的 ...

  7. collections,time,random,os, sys 模块的使用

    主要内容:1. 模块的简单认识2. collections模块3. time时间模块4. random模块5. os模块6. sys模块 一. 模块的简单认识什么是模块. 模块就是我们把装有特定功能的 ...

  8. from collections import namedtuple 使用

    from collections import namedtuple Point = namedtuple('Point', ['x', 'y'])#本质就是等价于 class Point(): # ...

  9. Python的collections之namedtuple的使用及其优势

    类实现: class User: def __init__(self, name, age, height): self.name = name self.age = age self.height ...

随机推荐

  1. chapter02 PCA主成分分析在手写数字识别分类的应用

    #coding=utf8 # 导入numpy工具包. import numpy as np # 导入pandas用于数据分析. import pandas as pd from sklearn.met ...

  2. Spring DI

    一.   Spring DI 依赖注入 利用spring IOC实例化了对象,而DI将实例化的对象注入到需要对象的地方,完成初始化任务. 对象由spring创建,之后再由spring给属性赋值 spr ...

  3. Codeforces gym101955 A【树形dp】

    LINK 有n个大号和m个小号 然后需要对这些号进行匹配,一个大号最多匹配2个小号 匹配条件是大号和小号构成了前缀关系 字符串长度不超过10 问方案数 思路 因为要构成前缀关系 所以就考虑在trie树 ...

  4. LG1116 【车厢重组】

    前言 看了大家的做法,什么冒泡排序,插入排序,树状数组,线段树,都好厉害呐,我都没想出来 但我发现竟然还没有人用主席树,于是我跟大家交流一下 主席树 做法 显然我们有 \(Ans=\sum_{i=1} ...

  5. Web Js推断键盘出发事件

      window.document.onkeydown = disableRefresh; function disableRefresh(evt){ evt = (evt) ? evt : wind ...

  6. Spring插件3.8.2的安装

    主机环境:win8 64bit eclipse版本:4.5.2 MARS 插件版本:Spring Tool Suite3.8.2 安装过程:直接在线安装,没有先在官网把插件下载再安装. 主要步骤: 1 ...

  7. POJ1631 LIS模板

    题目:http://poj.org/problem?id=1631 两种nlogn的方法. 1.树状数组优化暴力.有种扫描线的感觉,以时间保证位置,把值作为数组脚标. 2.记录长为...的上升子序列末 ...

  8. 49个你应该了解的Android Studio技巧、插件与资源 http://www.apkbus.com/blog-822721-72630.html (出处: 安卓巴士 - 安卓开发 - Android开发 - 安卓 - 移动互联网门户)

    49个你应该了解的Android Studio技巧.插件与资源http://www.apkbus.com/blog-822721-72630.html(出处: 安卓巴士 - 安卓开发 - Androi ...

  9. VS2010程序调试

    http://blog.csdn.net/kingzone_2008/article/details/8133048 调试初识及实例.

  10. php curl_init函数用法(http://blog.sina.com.cn/s/blog_640738130100tsig.html)

    使用PHP的cURL库可以简单和有效地去抓网页.你只需要运行一个脚本,然后分析一下你所抓取的网页,然后就可以以程序的方式得到你想要的数据了.无论是你想从从一个链接上取部分数据,或是取一个XML文件并把 ...