博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
不可不知的python模块--collections
阅读量:5791 次
发布时间:2019-06-18

本文共 4233 字,大约阅读时间需要 14 分钟。

基本介绍

Python拥有一些内置的数据类型,比如str, int, list, tuple, dict等, collections模块在这些内置数据类型的基础上,提供了几个额外的数据类型:

  • namedtuple(): 生成可以使用名字来访问元素内容的tuple子类
  • deque: 双端队列,可以快速的从另外一侧追加和推出对象
  • Counter: 计数器,主要用来计数
  • OrderedDict: 有序字典
  • defaultdict: 带有默认值的字典

namedtuple()

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

例子1:

import collectionscoordinate = collections.namedtuple('Coordinate', ['x', 'y'])co = coordinate(10,20)print(type(co))print(co)print(co.x, co.y)print(co[0], co[1])co = coordinate._make([100, 200])print(co)print(co.x, co.y)co = co._replace(x=30)print(co)print(co.x, co.y)

运行:

Coordinate(x=10, y=20)10 2010 20Coordinate(x=100, y=200)100 200Coordinate(x=30, y=200)30 200

例子2:

websites = [    ('Sohu', 'http://www.sohu.com/', u'张朝阳'),    ('Sina', 'http://www.sina.com.cn/', u'王志东'),    ('163', 'http://www.163.com/', u'丁磊')]Website = collections.namedtuple('Website', ['name', 'url', 'founder'])for website in websites:    website = Website._make(website)    print(website)

运行:

Website(name='Sohu', url='http://www.sohu.com/', founder='张朝阳')Website(name='Sina', url='http://www.sina.com.cn/', founder='王志东')Website(name='163', url='http://www.163.com/', founder='丁磊')

例子3(一摞有序的纸牌):

import collectionsCard = collections.namedtuple('Card', ['rank', 'suit'])class FrenchDeck:    ranks = [str(n) for n in range(2, 11)] + list('JQKA')    suits = 'spades diamonds clubs hearts'.split()    def __init__(self):        self._cards = [Card(rank, suit) for suit in self.suits for rank in self.ranks]    def __len__(self):        return len(self._cards)    def __getitem__(self, position):        return self._cards[position]beer_card = Card('7', 'diamonds')print(beer_card)deck = FrenchDeck()print(len(deck))print(deck._cards)print(deck[0])print(deck[-1])from random import choiceprint(choice(deck))print(deck[:3])print(deck[12::13])     # 先抽出索引是 12 的那张牌,然后每隔 13 张牌拿 1 张for card in deck:    print(card)for card in reversed(deck):    print(card)

deque

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

原生的list也可以从头部添加和取出对象?就像这样:

l.insert(0, v)l.pop(0)

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

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

例子:

# -*- coding: utf-8 -*-"""下面这个是一个有趣的例子,主要使用了deque的rotate方法来实现了一个无限循环的加载动画"""import sysimport timefrom collections import dequefancy_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 Counters = '''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)# 获取出现频率最高的5个字符print c.most_common(5)

运行:

[(' ', 54), ('e', 32), ('s', 25), ('a', 24), ('t', 24)]

OrderedDict

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

例子:

# -*- coding: utf-8 -*-from collections import OrderedDictitems = (    ('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, vprint 'Ordered Dict:'for k, v in ordered_dict.items():    print k, v

运行:

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

defaultdict

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

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

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

运行:

defaultdict(
, {'male': ['John', 'Jack', 'Pony'], 'female': ['Lily', 'Lucy']})

转载地址:http://nqwfx.baihongyu.com/

你可能感兴趣的文章
志在必得的。。。。失败。。。
查看>>
python的逻辑运算符
查看>>
设置浏览器默认滚动条(谷歌)
查看>>
我发现:在StackOverflow上拯救歪果仁十分有意思!
查看>>
004 -- Circle LinkList 3 -- Puzzels_Magic Poker and Latin
查看>>
wp后台更新瓷片
查看>>
hdu 1712 (分组背包入门)
查看>>
开源监控软件ganglia安装手册
查看>>
计算机网络改变了人们的工作方式
查看>>
category
查看>>
apache的扩展模块安装
查看>>
C++深度探索系列:智能指针(Smart Pointer) [一] (转)
查看>>
apple for liudanping
查看>>
java如何准确的读取多音字
查看>>
java中应用循环及结构打印图案
查看>>
图像仿射变换解析
查看>>
多表查询 及聚合查询
查看>>
urllib.unquote()
查看>>
2012/9/28——关于复习
查看>>
[解题报告]579 - ClockHands
查看>>