[ Collections 学习02 ] collections - 2017.1.6

Collections

【资源Links】:https://docs.python.org/2/library/collections.html

  我们都知道,Python拥有一些内置的数据类型,比如str、set、list、tuple、dict等,collections模块在这些内置数据类型的基础上,提供了5个额外的数据类型:

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

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

  3:Counter:计数器,主要用来计数;

  4:OrderdDict:有序字典;

  5:defaultdict:带有默认值的字典;

一、namedtuple()

  namedtuple主要用来产生可以使用名称来访问元素的数据对象,通常用来增强代码的可读性,在访问一些tuple类型的数据时尤其好用。

 1 # -*- coding:utf-8 -*-
 2 """
 3 比如我们用户拥有一个这样的数据结构,每一个对象是拥有三个元素的tuple。
 4 使用namedtuple方法就可以方便的通过tuple来生成可读性更高也更好用的数据结构。
 5 """
 6 from collections import namedtuple
 7 websites=[
 8     (‘Sohu‘, ‘http://www.google.com/‘, u‘张朝阳‘),
 9     (‘Sina‘, ‘http://www.sina.com.cn/‘, u‘王志东‘),
10     (‘163‘, ‘http://www.163.com/‘, u‘丁磊‘)
11 ]
12 Website=namedtuple(‘Website‘,[‘name‘,‘url‘,‘founer‘])
13 for website in websites:
14     website=Website._make(website)
15     print website
16
17 # results
18 Website(name=‘Sohu‘, url=‘http://www.google.com/‘, founer=u‘\u5f20\u671d\u9633‘)
19 Website(name=‘Sina‘, url=‘http://www.sina.com.cn/‘, founer=u‘\u738b\u5fd7\u4e1c‘)
20 Website(name=‘163‘, url=‘http://www.163.com/‘, founer=u‘\u4e01\u78ca‘)

二、deque

  deque其实是double-ended queue的缩写,翻译过来就是双端队列,它最大的好处就是现实了从队列头部快速增加和取出对象:popleft()、appendleft()。

  原声的list也可以从头部添加和取出对象,但是值得注意的是,list对象的两种方法的时间复杂度是O(n),也就是说随着袁术数量的增加耗时呈线性上升。而使用deque对象则是O(1)的复杂度,所以当你的代码有这样的需求的时候,一定要记得使用deque。

  作为一个双端队列,deque还提供了一些其他的好用方法,比如rotate等。

# -*- coding: utf-8 -*-
"""
下面这个是一个有趣的例子,主要使用了deque的rotate方法来实现了一个无限循环
的加载动画
"""
import sys
import time
from collections import deque
fancy_loading = deque(‘>--------------------‘)
while True:
    print ‘\r%s‘ % ‘‘.join(fancy_loading),
    fancy_loading.rotate(1)
    sys.stdout.flush()
    time.sleep(0.08)

三、Counter

  计数器是一个非常常用的功能需求,collections也贴心的为你提供了这个功能。

# -*- coding:utf-8 -*-
"""
下面这个例子就是使用Counter模块统计一段句子里面所有字符出现的次数
"""
from collections import Counter
s = ‘‘‘A Counter is a dict subclass for counting hashable objects. It is an unordered collection where elements are stored as dictionary keys and their counts are stored as dictionary values. Counts are allowed to be any integer value including zero or negative counts. The Counter class is similar to bags or multisets in other languages.‘‘‘.lower()
c=Counter(s)
# 获取出现频率最高的10个字符
print c.most_common(10)

# results
[(‘ ‘, 54), (‘e‘, 32), (‘s‘, 25), (‘a‘, 24), (‘t‘, 24), (‘o‘, 22), (‘n‘, 21), (‘i‘, 20), (‘r‘, 20), (‘c‘, 15)]

四、OrderedDict

  在Python中,dict这个数据结构由于Hash的特性,是无序的,这在有的时候会给我们带来一些麻烦,幸运的是,collections模块为我们提供了OrderedDict,当你要获得一个有序的字典对象时,用它就对了。

 # -*- coding:utf-8 -*-
from collections import OrderedDict
items=(
    (‘A‘,1),
    (‘B‘,2),
    (‘C‘,3)
)
regular_dict=dict(items)
ordered_dict=OrderedDict(items)
print ‘Regular Dict:‘
for k,v in regular_dict.items():
    print k,v

print ‘Ordered Dict:‘
for k,v in ordered_dict.items():
    print k,v

# results
Regular Dict:
A 1
C 3
B 2
Ordered Dict:
A 1
B 2
C 3

五、defaultdict

  我们都知道,在使用Python原生的数据结构dict的时候,如果用d[key]这样的方式访问,当指定的key不存在时,是会抛出KeyError异常的。

  但是,如果使用defaultdict,只要你传入一个默认的工厂方法,那么请求一个不存在的key时,便会调用这个工厂方法使用其结果来作为这个key的默认值。

 # -*- coding:utf-8 -*-
from collections import defaultdict
members= [
    # Age, name
    [‘male‘, ‘John‘],
    [‘male‘, ‘Jack‘],
    [‘female‘, ‘Lily‘],
    [‘male‘, ‘Pony‘],
    [‘female‘, ‘Lucy‘],
]
results=defaultdict(list)
for sex,name in members:
    results[sex].append(name)
print results

# results
defaultdict(<type ‘list‘>, {‘male‘: [‘John‘, ‘Jack‘, ‘Pony‘], ‘female‘: [‘Lily‘, ‘Lucy‘]})

  上面只是非常简单的介绍了一下collections模块的主要内容,主要目的就是当你碰到适合使用它们的场所时,能够记起并使用它们,起到事半功倍的效果。

  如果要对它们有一个全面和深入了解的话,还是建议阅读官方文档和模块源码。

  

  

时间: 2024-08-26 06:12:08

[ Collections 学习02 ] collections - 2017.1.6的相关文章

[Guava学习笔记]Collections: 不可变集合, 新集合类型

不可变集合 不接受null值. 创建:ImmutableSet.copyOf(set); ImmutableMap.of(“a”, 1, “b”, 2); public static final ImmutableSet<Color> GOOGLE_COLORS = ImmutableSet.<Color>builder() .addAll(WEBSAFE_COLORS) .add(new Color(0, 191, 255)) .build(); 可以有序(如ImmutableS

ThinkPhp学习02

原文:ThinkPhp学习02 一.什么是MVC                M -Model 编写model类 对数据进行操作 V -View  编写html文件,页面呈现 C -Controller 编写类文件(UserAction.class.php)二.ThinkPHP的MVC特点        三.ThinkPHP的MVC对应的目录    M 项目目录/应用目录/Lib/Model V 项目目录/应用目录/Tpl C 项目目录/应用目录/Lib/Action四.url访问C     

设计模式学习02—工厂模式

1.动机与定义 我们在程序中使用一个对象时,需要new一下,如果需要设置其他值就再初始化一下.比如我要使用一个按钮,手动new一个矩形按钮,然后初始化一些值,如显示文字,背景色等. // 矩形按钮 IButton btn = new RecButton(); // 初始化其他值 btn.setText("提交"); btn.setBackgroundColor("#00aaff"); // 其他初始化省略 // 圆形按钮 IButton btn2 = new Rou

ConcurrentHashMap和 CopyOnWriteArrayList提供线程安全性和可伸缩性 以及 同步的集合类 Hashtable 和 Vector Collections.synchronizedMap 和 Collections.synchronizedList 区别缺点

ConcurrentHashMap和 CopyOnWriteArrayList提供线程安全性和可伸缩性 DougLea的 util.concurrent 包除了包含许多其他有用的并发构造块之外,还包含了一些主要集合类型 List 和 Map 的高性能的.线程安全的实现.在本月的 Java理论与实践中,BrianGoetz向您展示了用 ConcurrentHashMap 替换 Hashtable 或 synchronizedMap ,将有多少并发程序获益. 在Java类库中出现的第一个关联的集合类

RabbitMQ (消息队列)专题学习02 Hello World

一.概述 RabbitMQ可以当做一个消息代理,它的核心原理非常简单:即接收和发送消息,可以把它想象成一个邮局:我们把信件放入邮箱,邮递员就会把信件投递到你的收件人处,RabbitMQ就是一个邮箱.邮局.投递员功能综合体,整个过程就是:邮箱接收信件,邮局转发信件,投递员投递信件到达收件人处. RabbitMQ和邮局的主要区别就是RabbitMQ接收.存储和发送的是二进制数据----消息. 在专题学习一中我们已经简单提到了一些概念,在此我们更为深入的学习下RabbitMQ相关的专有名词. 1.生产

Java学习02

昨天学了一天Java,今天来回忆总结一下. Java是一门面向对象的语言,与C++有很多地方都很相似. Java的特点: 1.取消了指针,用引用代替 2.有垃圾自动回收机制,程序员不需要手动管理内存 3.跨平台性(JVM) 昨天主要从最基础的开始学,学习了变量,操作符,语句结构.下面用程序来回顾一下. 1 /* 2 测试4种进制 3 1.二进制 4 2.十进制 5 3.八进制 0开头 6 4.十六进制 0x开头 7 */ 8 9 //当class声明为public时文件名必须为类名一样 10 p

Liunx学习02

由于昨晚太忙没有时间更新学习的,现在借着上班的5分钟来更新下: 注:liunx下以.为开头的文件都是隐藏的,用 ls -a 可以查看 继续上一篇的date命令:date能查看系统时间,也可以更改时间: date  0721135613.56  07-21 11:35:13:56 hwclock查看主板时间 hwclock -w 以系统时间为准,更改主板时间 hwclock -s 以主板时间为准,更改系统时间 cal查看日历 cal 3 2011 查看2011年3月的日历 halt.halt -p

python深入学习02 上下文管理器

上下文管理器(context manager)主要用于规定某个对象的使用范围.一旦进入或者离开该使用范围,会有特殊操作被调用 (比如为对象分配或者释放内存).它的语法形式是with...as... 关闭文件 上下文管理器有个特别好的优点:可以在不使用文件的时候,自动关闭文件,节省了f.close()的步骤 上下文管理器有隶属于它的程序块.当隶属的程序块执行结束的时候(也就是不再缩进),上下文管理器自动关闭了文件 (我们通过f.closed来查询文件是否关闭).我们相当于使用缩进规定了文件对象f的

Java.utils.Collections学习

阅读类库代码是有意义的,尤其是Java集合类框架以及算法Collections Arrays都是值得阅读的, 一来可以减少新手程序员的编码的工作量,二来,对于常见的需求,程序员应该先找下是否有现成的类库 1.避免不必要的重复编码 2.自己编写的算法代码 容易出错,而且需要编写测试来保证正确性 3.使用类库的算法是业界一般做法 ------------------------------------------------------------ public static <T> int bi