Python之collections模块详细实例
Python作為一個(gè)“內(nèi)置電池”的編程語(yǔ)言,標(biāo)準(zhǔn)庫(kù)里面擁有非常多好用的模塊。比如今天想給大家 介紹的collections?就是一個(gè)非常好的例子。
基本介紹
我們都知道,Python擁有一些內(nèi)置的數(shù)據(jù)類(lèi)型,比如str, int, list, tuple, dict等, collections模塊在這些內(nèi)置數(shù)據(jù)類(lèi)型的基礎(chǔ)上,提供了幾個(gè)額外的數(shù)據(jù)類(lèi)型:
- namedtuple(): 生成可以使用名字來(lái)訪問(wèn)元素內(nèi)容的tuple子類(lèi)
- deque: 雙端隊(duì)列,可以快速的從另外一側(cè)追加和推出對(duì)象
- Counter: 計(jì)數(shù)器,主要用來(lái)計(jì)數(shù)
- OrderedDict: 有序字典
- defaultdict: 帶有默認(rèn)值的字典
namedtuple()
namedtuple主要用來(lái)產(chǎn)生可以使用名稱(chēng)來(lái)訪問(wèn)元素的數(shù)據(jù)對(duì)象,通常用來(lái)增強(qiáng)代碼的可讀性, 在訪問(wèn)一些tuple類(lèi)型的數(shù)據(jù)時(shí)尤其好用。
舉個(gè)栗子
# -*- coding: utf-8 -*- """ 比如我們用戶(hù)擁有一個(gè)這樣的數(shù)據(jù)結(jié)構(gòu),每一個(gè)對(duì)象是擁有三個(gè)元素的tuple。 使用namedtuple方法就可以方便的通過(guò)tuple來(lái)生成可讀性更高也更好用的數(shù)據(jù)結(jié)構(gòu)。 """ from collections import namedtuplewebsites = [('Sohu', 'http://www.google.com/', u'張朝陽(yáng)'),('Sina', 'http://www.sina.com.cn/', u'王志東'),('163', 'http://www.163.com/', u'丁磊') ]Website = namedtuple('Website', ['name', 'url', 'founder'])for website in websites:website = Website._make(website)print website# Result: Website(name='Sohu', url='http://www.google.com/', founder=u'\u5f20\u671d\u9633') Website(name='Sina', url='http://www.sina.com.cn/', founder=u'\u738b\u5fd7\u4e1c') Website(name='163', url='http://www.163.com/', founder=u'\u4e01\u78ca')deque
deque其實(shí)是?double-ended?queue?的縮寫(xiě),翻譯過(guò)來(lái)就是雙端隊(duì)列,它最大的好處就是實(shí)現(xiàn)了從隊(duì)列 頭部快速增加和取出對(duì)象:?.popleft(),?.appendleft()?。
你可能會(huì)說(shuō),原生的list也可以從頭部添加和取出對(duì)象啊?就像這樣:
insert(0, v)
pop(0)
但是值得注意的是,list對(duì)象的這兩種用法的時(shí)間復(fù)雜度是?O(n)?,也就是說(shuō)隨著元素?cái)?shù)量的增加耗時(shí)呈 線(xiàn)性上升。而使用deque對(duì)象則是?O(1)?的復(fù)雜度,所以當(dāng)你的代碼有這樣的需求的時(shí)候, 一定要記得使用deque。
作為一個(gè)雙端隊(duì)列,deque還提供了一些其他的好用方法,比如?rotate?等。
舉個(gè)栗子
# -*- coding: utf-8 -*- """ 下面這個(gè)是一個(gè)有趣的例子,主要使用了deque的rotate方法來(lái)實(shí)現(xiàn)了一個(gè)無(wú)限循環(huán) 的加載動(dòng)畫(huà) """ import sys import time from collections import dequefancy_loading = deque('>--------------------')while True:print '\r%s' % ''.join(fancy_loading),fancy_loading.rotate(1)sys.stdout.flush()time.sleep(0.08)# Result:# 一個(gè)無(wú)盡循環(huán)的跑馬燈 ------------->-------Counter
計(jì)數(shù)器是一個(gè)非常常用的功能需求,collections也貼心的為你提供了這個(gè)功能。
舉個(gè)栗子
# -*- coding: utf-8 -*- """ 下面這個(gè)例子就是使用Counter模塊統(tǒng)計(jì)一段句子里面所有字符出現(xiàn)次數(shù) """ 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) # 獲取出現(xiàn)頻率最高的5個(gè)字符 print c.most_common(5)# Result: [(' ', 54), ('e', 32), ('s', 25), ('a', 24), ('t', 24)]OrderedDict
在Python中,dict這個(gè)數(shù)據(jù)結(jié)構(gòu)由于hash的特性,是無(wú)序的,這在有的時(shí)候會(huì)給我們帶來(lái)一些麻煩, 幸運(yùn)的是,collections模塊為我們提供了OrderedDict,當(dāng)你要獲得一個(gè)有序的字典對(duì)象時(shí),用它就對(duì)了。
舉個(gè)栗子
# -*- 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# Result: Regular Dict: A 1 C 3 B 2 Ordered Dict: A 1 B 2 C 3defaultdict
我們都知道,在使用Python原生的數(shù)據(jù)結(jié)構(gòu)dict的時(shí)候,如果用?d[key]?這樣的方式訪問(wèn), 當(dāng)指定的key不存在時(shí),是會(huì)拋出KeyError異常的。
但是,如果使用defaultdict,只要你傳入一個(gè)默認(rèn)的工廠方法,那么請(qǐng)求一個(gè)不存在的key時(shí), 便會(huì)調(diào)用這個(gè)工廠方法使用其結(jié)果來(lái)作為這個(gè)key的默認(rèn)值。
# -*- 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# Result: defaultdict(<type 'list'>, {'male': ['John', 'Jack', 'Pony'], 'female': ['Lily', 'Lucy']})?
新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎(jiǎng)!定制產(chǎn)品紅包拿不停!總結(jié)
以上是生活随笔為你收集整理的Python之collections模块详细实例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python twised系列教程四–t
- 下一篇: Python3 中的 asyncio a