- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章python的常用模块之collections模块详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
认识模块 。
什么是模块?
常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀.
但其实import加载的模块分为四个通用类别: 1 使用python编写的代码(.py文件) 2 已被编译为共享库或dll的c或c++扩展 3 包好一组模块的包 4 使用c编写并链接到python解释器的内置模块 。
为何要使用模块?
如果你退出python解释器然后重新进入,那么你之前定义的函数或者变量都将丢失,因此我们通常将程序写到文件中以便永久保存下来,需要时就通过python test.py方式去执行,此时test.py被称为脚本script.
随着程序的发展,功能越来越多,为了方便管理,我们通常将程序分成一个个的文件,这样做程序的结构更清晰,方便管理。这时我们不仅仅可以把这些文件当做脚本去执行,还可以把他们当做模块来导入到其他的模块中,实现了功能的重复利用, 。
常用模块 。
1. collections模块 。
在内置数据类型(dict、list、set、tuple)的基础上,collections模块还提供了几个额外的数据类型:counter、deque、defaultdict、namedtuple和ordereddict等.
1.namedtuple: 生成可以使用名字来访问元素内容的tuple 2.deque: 双端队列,可以快速的从另外一侧追加和推出对象 3.counter: 计数器,主要用来计数 4.ordereddict: 有序字典 5.defaultdict: 带有默认值的字典 。
我们知道tuple可以表示不变集合,例如,一个点的二维坐标就可以表示成:
1
|
p
=
(
1
,
2
)
|
但是,看到(1, 2),很难看出这个tuple是用来表示一个坐标的.
这时,namedtuple就派上了用场:
用法:namedtuple('名称', [属性list])
1
2
3
4
5
6
7
|
>>>
from
collections
import
namedtuple
>>> point
=
namedtuple(
'point'
, [
'x'
,
'y'
])
>>> p
=
point(
1
,
2
)
>>> p.x
1
>>> p.y
2
|
类似的,如果要用坐标和半径表示一个圆,也可以用namedtuple定义:
1
2
3
4
5
6
|
from
collections
import
namedtuple
cirle
=
namedtuple(
"cirle"
,[
'x'
,
'y'
,
'z'
])
c
=
cirle(
4
,
5
,
6
)
print
(c.x,c.y,c.z)
output:
4
5
6
|
2. deque 。
使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,插入和删除效率很低.
deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈:
1
2
3
4
5
6
|
>>>
from
collections
import
deque
>>> q
=
deque([
'a'
,
'b'
,
'c'
])
>>> q.append(
'x'
)
>>> q.appendleft(
'y'
)
>>> q
deque([
'y'
,
'a'
,
'b'
,
'c'
,
'x'
])
|
deque除了实现list的append()和pop()外,还支持appendleft()和popleft(),这样就可以非常高效地往头部添加或删除元素.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
from
collections
import
deque
dq
=
deque([
1
,
2
])
dq.append(
'a'
)
# 从后面放数据 [1,2,'a']
dq.appendleft(
'b'
)
# 从前面放数据 ['b',1,2,'a']
dq.insert(
2
,
3
)
#['b',1,3,2,'a']
print
(dq.pop())
# 从后面取数据
print
(dq.pop())
# 从后面取数据
print
(dq.popleft())
# 从前面取数据
print
(dq)
output:
a
2
b
deque([
1
,
3
])
|
3. ordereddict 。
使用dict时,key是无序的。在对dict做迭代时,我们无法确定key的顺序.
如果要保持key的顺序,可以用ordereddict:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
>>>
from
collections
import
ordereddict
>>> d
=
dict
([(
'a'
,
1
), (
'b'
,
2
), (
'c'
,
3
)])
>>> d
# dict的key是无序的
{
'a'
:
1
,
'c'
:
3
,
'b'
:
2
}
>>> od
=
ordereddict([(
'a'
,
1
), (
'b'
,
2
), (
'c'
,
3
)])
>>> od
# ordereddict的key是有序的
ordereddict([(
'a'
,
1
), (
'b'
,
2
), (
'c'
,
3
)])
#有序字典
from
collections
import
ordereddict
od
=
ordereddict([(
'a'
,
1
), (
'b'
,
2
), (
'c'
,
3
)])
print
(od)
# ordereddict的key是有序的
print
(od[
'a'
])
for
k
in
od:
print
(k)
output:
ordereddict([(
'a'
,
1
), (
'b'
,
2
), (
'c'
,
3
)])
1
a
b
c
|
注意,ordereddict的key会按照插入的顺序排列,不是key本身排序 。
4. defaultdict 。
使用dict时,如果引用的key不存在,就会抛出keyerror。如果希望key不存在时,返回一个默认值,就可以用defaultdict:
1
2
3
4
5
6
7
|
>>>
from
collections
import
defaultdict
>>> dd
=
defaultdict(
lambda
:
'n/a'
)
>>> dd[
'key1'
]
=
'abc'
>>> dd[
'key1'
]
# key1存在
'abc'
>>> dd[
'key2'
]
# key2不存在,返回默认值
'n/a'
|
5. counter 。
counter类的目的是用来跟踪值出现的次数。它是一个无序的容器类型,以字典的键值对形式存储,其中元素作为key,其计数作为value。计数值可以是任意的interger(包括0和负数)。counter类和其他语言的bags或multisets很相似.
1
2
3
|
c
=
counter(
'abcdeabcdabcaba'
)
print
c
输出:counter({
'a'
:
5
,
'b'
:
4
,
'c'
:
3
,
'd'
:
2
,
'e'
:
1
})
|
创建 。
下面的代码说明了counter类创建的四种方法:
counter类的创建
1
2
3
4
|
>>> c
=
counter()
# 创建一个空的counter类
>>> c
=
counter(
'gallahad'
)
# 从一个可iterable对象(list、tuple、dict、字符串等)创建
>>> c
=
counter({
'a'
:
4
,
'b'
:
2
})
# 从一个字典对象创建
>>> c
=
counter(a
=
4
, b
=
2
)
# 从一组键值对创建
|
计数值的访问与缺失的键 。
当所访问的键不存在时,返回0,而不是keyerror;否则返回它的计数.
计数值的访问 。
1
2
3
4
5
6
7
|
>>> c
=
counter(
"abcdefgab"
)
>>> c[
"a"
]
2
>>> c[
"c"
]
1
>>> c[
"h"
]
0
|
计数器的更新(update和subtract) 。
可以使用一个iterable对象或者另一个counter对象来更新键值.
计数器的更新包括增加和减少两种。其中,增加使用update()方法:
计数器的更新(update) 。
1
2
3
4
5
6
7
8
|
>>> c
=
counter(
'which'
)
>>> c.update(
'witch'
)
# 使用另一个iterable对象更新
>>> c[
'h'
]
3
>>> d
=
counter(
'watch'
)
>>> c.update(d)
# 使用另一个counter对象更新
>>> c[
'h'
]
4
|
减少则使用subtract()方法:
计数器的更新(subtract) 。
1
2
3
4
5
6
7
8
|
>>> c
=
counter(
'which'
)
>>> c.subtract(
'witch'
)
# 使用另一个iterable对象更新
>>> c[
'h'
]
1
>>> d
=
counter(
'watch'
)
>>> c.subtract(d)
# 使用另一个counter对象更新
>>> c[
'a'
]
-
1
|
键的修改和删除 。
当计数值为0时,并不意味着元素被删除,删除元素应当使用del.
1
2
3
4
5
6
7
8
9
|
>>> c
=
counter(
"abcdcba"
)
>>> c
counter({
'a'
:
2
,
'c'
:
2
,
'b'
:
2
,
'd'
:
1
})
>>> c[
"b"
]
=
0
>>> c
counter({
'a'
:
2
,
'c'
:
2
,
'd'
:
1
,
'b'
:
0
})
>>>
del
c[
"a"
]
>>> c
counter({
'c'
:
2
,
'b'
:
2
,
'd'
:
1
})
|
elements() 。
返回一个迭代器。元素被重复了多少次,在该迭代器中就包含多少个该元素。元素排列无确定顺序,个数小于1的元素不被包含.
elements()方法 。
1
2
3
|
>>> c
=
counter(a
=
4
, b
=
2
, c
=
0
, d
=
-
2
)
>>>
list
(c.elements())
[
'a'
,
'a'
,
'a'
,
'a'
,
'b'
,
'b'
]
|
most_common([n]) 。
返回一个topn列表。如果n没有被指定,则返回所有元素。当多个元素计数值相同时,排列是无确定顺序的。 most_common()方法 。
1
2
3
4
5
|
>>> c
=
counter(
'abracadabra'
)
>>> c.most_common()
[(
'a'
,
5
), (
'r'
,
2
), (
'b'
,
2
), (
'c'
,
1
), (
'd'
,
1
)]
>>> c.most_common(
3
)
[(
'a'
,
5
), (
'r'
,
2
), (
'b'
,
2
)]
|
浅拷贝copy 。
1
2
3
4
5
6
|
>>> c
=
counter(
"abcdcba"
)
>>> c
counter({
'a'
:
2
,
'c'
:
2
,
'b'
:
2
,
'd'
:
1
})
>>> d
=
c.copy()
>>> d
counter({
'a'
:
2
,
'c'
:
2
,
'b'
:
2
,
'd'
:
1
})
|
算术和集合操作 。
+、-、&、|操作也可以用于counter。其中&和|操作分别返回两个counter对象各元素的最小值和最大值。需要注意的是,得到的counter对象将删除小于1的元素.
counter对象的算术和集合操作 。
1
2
3
4
5
6
7
8
9
10
|
>>> c
=
counter(a
=
3
, b
=
1
)
>>> d
=
counter(a
=
1
, b
=
2
)
>>> c
+
d
# c[x] + d[x]
counter({
'a'
:
4
,
'b'
:
3
})
>>> c
-
d
# subtract(只保留正数计数的元素)
counter({
'a'
:
2
})
>>> c & d
# 交集: min(c[x], d[x])
counter({
'a'
:
1
,
'b'
:
1
})
>>> c | d
# 并集: max(c[x], d[x])
counter({
'a'
:
3
,
'b'
:
2
})
|
其他常用操作 。
下面是一些counter类的常用操作,来源于python官方文档 。
counter类常用操作 。
1
2
3
4
5
6
7
8
9
|
sum
(c.values())
# 所有计数的总数
c.clear()
# 重置counter对象,注意不是删除
list
(c)
# 将c中的键转为列表
set
(c)
# 将c中的键转为set
dict
(c)
# 将c中的键值对转为字典
c.items()
# 转为(elem, cnt)格式的列表
counter(
dict
(list_of_pairs))
# 从(elem, cnt)格式的列表转换为counter类对象
c.most_common()[:
-
n:
-
1
]
# 取出计数最少的n个元素
c
+
=
counter()
# 移除0和负值
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:http://www.cnblogs.com/ChinacloudTech/p/10031915.html 。
最后此篇关于python的常用模块之collections模块详解的文章就讲到这里了,如果你想了解更多关于python的常用模块之collections模块详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
全称“Java Virtual Machine statistics monitoring tool”(statistics 统计;monitoring 监控;tool 工具) 用于监控虚拟机的各种运
主要是讲下Mongodb的索引的查看、创建、删除、类型说明,还有就是Explain执行计划的解释说明。 可以转载,但请注明出处。  
1>单线程或者单进程 相当于短链接,当accept之后,就开始数据的接收和数据的发送,不接受新的连接,即一个server,一个client 不存在并发。 2>循环服务器和并发服务器
详解 linux中的关机和重启命令 一 shutdown命令 shutdown [选项] 时间 选项: ?
首先,将json串转为一个JObject对象: ? 1
matplotlib官网 matplotlib库默认英文字体 添加黑体(‘SimHei')为绘图字体 代码: plt.rcParams['font.sans-serif']=['SimHei'
在并发编程中,synchronized关键字是常出现的角色。之前我们都称呼synchronized关键字为重量锁,但是在jdk1.6中对synchronized进行了优化,引入了偏向锁、轻量锁。本篇
一般我们的项目中会使用1到2个数据库连接配置,同程艺龙的数据库连接配置被收拢到统一的配置中心,由DBA统一配置和维护,业务方通过某个字符串配置拿到的是Connection对象。  
实例如下: ? 1
1. MemoryCahe NetCore中的缓存和System.Runtime.Caching很相似,但是在功能上做了增强,缓存的key支持object类型;提供了泛型支持;可以读缓存和单个缓存
argument是javascript中函数的一个特殊参数,例如下文,利用argument访问函数参数,判断函数是否执行 复制代码 代码如下: <script
一不小心装了一个Redis服务,开了一个全网的默认端口,一开始以为这台服务器没有公网ip,结果发现之后悔之莫及啊 某天发现cpu load高的出奇,发现一个minerd进程 占了大量cpu,googl
今天写这个是为了 提醒自己 编程过程 不仅要有逻辑 思想 还有要规范 代码 这样可读性 1、PHP 编程规范与编码习惯最主要的有以下几点: 1 文件说明 2 funct
摘要:虚拟机安装时一般都采用最小化安装,默认没有lspci工具。一台测试虚拟网卡性能的虚拟机,需要lspci工具来查看网卡的类型。本文描述了在一个虚拟机中安装lspci工具的具体步骤。 由于要测试
1、修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统
目录 算术运算符 基本四则运算符 增量赋值运算符 自增/自减运算符 关系运算符 逻
如下所示: ? 1
MapperScannerConfigurer之sqlSessionFactory注入方式讲解 首先,Mybatis中的有一段配置非常方便,省去我们去写DaoImpl(Dao层实现类)的时间,这个
Linux的网络虚拟化是LXC项目中的一个子项目,LXC包括文件系统虚拟化,进程空间虚拟化,用户虚拟化,网络虚拟化,等等,这里使用LXC的网络虚拟化来模拟多个网络环境。 本文从基本的网络设备讲
? 1
我是一名优秀的程序员,十分优秀!