本文后大家啊分享的主要是python
標(biāo)準(zhǔn)庫的collections
模塊,一起來看看吧,希望對大家
學(xué)習(xí)python有所幫助。.
這個模塊提供幾個非常有用的Python
容器類型
1.容器
2.OrderedDict
OrderedDict
類似于正常的詞典,只是它記住了元素插入的順序,當(dāng)?shù)鼤r,返回它會根據(jù)插入的順序返回。
·
和正常字典相比
,
它是
”
有序
”
的
(
插入的順序
)
。
from collections import OrderedDict
dict1 = dict() #
普通字典
dict1['apple'] = 2
dict1['banana'] = 1
dict1['orange'] = 3
dict2 = OrderedDict() #
有序字典
dict2['apple'] = 2
dict2['banana'] = 1
dict2['orange'] = 3
for key,
value
in dict1.items():
print 'key:', key, ' value:',
value
for key,
value
in dict2.items():
print 'key:', key, ' value:',
value
# ----
輸出結(jié)果
-----
#
普通字典
key: orange value: 3key: apple value: 2key: banana value: 1
#
有序字典
key: apple value: 2key: banana value: 1key: orange value: 3
·
如果重寫已經(jīng)存在的
key
,原始順序保持不變,如果刪除一個元素再重新插入,那么它會在末尾。
from collections
import OrderedDict
dict2 = OrderedDict()
dict2['apple'] = 2
dict2['banana'] = 1
dict2['orange'] = 3
#
直接重寫
apple
的值
,
順序不變
dict2['apple'] = 0
#
刪除在重新寫入
banana,
順序改變
dict2.pop('banana')
dict2['banana'] = 1
print dict2
# ----
輸出結(jié)果
-----
OrderedDict([('apple', 0), ('orange', 3), ('banana', 1)])
·
可以使用排序函數(shù),將普通字典變成
OrderedDict
。
from collections
import OrderedDict
d = {'banana': 3, 'apple': 4, 'pear': 1, 'orange': 2}
order_d = OrderedDict(sorted(d.items(), key=lambda t: t[1]))
for key,
value
in order_d.items():
print 'key:', key, ' value:',
value
# ----
輸出結(jié)果
-----key: pear value: 1key: orange value: 2key: banana value: 3key: apple value: 4
3.namedtuple
namedtuple
就是命名的
tuple
,一般情況下的
tuple
是這樣的
(item1, item2, item3,…)
,所有的
item
都只能通過
index
訪問,沒有明確的稱呼,而
namedtuple
就是事先把這些
item
命名,以后可以方便訪問。
from collections
import namedtuple
#
定義一個
namedtuple
類型
User
,并包含
name
,
sex
和
age
屬性。
User = namedtuple('User', ['name', 'sex', 'age'])
#
創(chuàng)建一個
User
對象
user1 = User(name='name1', sex='male', age=18)
#
也可以通過一個
list
來創(chuàng)建一個
User
對象,這里注意需要使用
"_make"
方法
user2 = User._make(['name2', 'male', 21])
print 'user1:', user1
#
使用點號獲取屬性
print 'name:', user1.name, ' sex:', user1.sex, ' age:', user1.age
#
將
User
對象轉(zhuǎn)換成字典,注意要使用
"_asdict"
print 'user1._asdict():', user1._asdict()
#
字典轉(zhuǎn)換成
namedtuple
name_dict = {'name': 'name3', 'sex': 'male', 'age': 20}
print 'dict2namedtuple:', User(**name_dict)
#
修改對象屬性,注意要使用
"_replace"
方法
print 'replace:', user1._replace(age=22)
#
----
輸出結(jié)果
-----user1:
User(name='name1', sex='male', age=18)
name:
name1
sex:
male
age:
18user1._asdict():
OrderedDict([('name', 'name1'), ('sex', 'male'), ('age', 18)])
dict2namedtuple:
User(name='name3', sex='male', age=20)
replace:
User(name='name1', sex='male', age=22)
4.Counter
Counter
類的目的是用來跟蹤值出現(xiàn)的次數(shù)。它是一個無序的容器類型,以字典的鍵值對形式存儲,其中元素作為
key
,其計數(shù)作為
value
。
· Counter
創(chuàng)建有如下幾種方法
from collections
import Counter
print Counter('aabbcccd') #
從一個可
iterable
對象(
list
、
tuple
、
dict
、字符串等)創(chuàng)建
print Counter(['a', 'a', 'c']) #
從一個可
iterable
對象(
list
、
tuple
、
dict
、字符串等)創(chuàng)建
print Counter({'a': 4, 'b': 2}) #
從一個字典對象創(chuàng)建
print Counter(a=4, b=2) #
從一組鍵值對創(chuàng)建
# ----
輸出結(jié)果
-----
Counter({'c': 3, 'a': 2, 'b': 2, 'd': 1})
Counter({'a': 2, 'c': 1})
Counter({'a': 4, 'b': 2})
Counter({'a': 4, 'b': 2})
·
獲取元素的計數(shù)時和
dict
類似
,
但是這里的
key
不存在時返回
0
,而不是
KeyError
>>> c = Counter("acda")>>> c["a"]2>>> c["h"]0
·
可以使用
update
和
subtract
對計數(shù)器進行更新
(
增加和減少
)
from collections
import Counter
c = Counter('aaabbc')
print 'c:', c
c.update("abc")print 'c.update("abc"):', c #
用另一個
iterable
對象
update
也可傳入一個
Counter
對象
c.subtract("abc")print 'c.subtract("abc"):', c #
用另一個
iterable
對象
subtract
也可傳入一個
Counter
對象
# ----
輸出結(jié)果
-----
c: Counter({'a': 3, 'b': 2, 'c': 1})
c.
update("abc"): Counter({'a': 4, 'b': 3, 'c': 2})
c.subtract("abc"): Counter({'a': 3, 'b': 2, 'c': 1})
·
返回計數(shù)次數(shù)
top n
的元素
from collections
import Counter
c = Counter('aaaabbcccddeeffg')
print c.most_common(3)
# ----
輸出結(jié)果
-----
[('a', 4), ('c', 3), ('b', 2)]
· Counter
還支持幾個為數(shù)不多的數(shù)學(xué)運算
+
、
-
、
&
、
|
from collections
import Counter
a = Counter(a=3, b=1)
b = Counter(a=1, b=1)
print 'a+b:', a + b #
加法
,
計數(shù)相加
print 'a-b:', a - b #
減法
,
計數(shù)相減
print 'b-a:', b - a #
只保留正計數(shù)
print 'a&b:', a & b #
交集
print 'a|b:', a | b #
并集
# ----
輸出結(jié)果
-----
a+b: Counter({'a': 4, 'b': 2})
a-b: Counter({'a': 2})
b-a: Counter()
a&b: Counter({'a': 1, 'b': 1})
a|b: Counter({'a': 3, 'b': 1})
5.deque
deque
就是雙端隊列,是一種具有隊列和棧的性質(zhì)的數(shù)據(jù)結(jié)構(gòu),適合于在兩端添加和刪除,類似與序列的容器
·
常用方法
from collections
import deque
d = deque([]) #
創(chuàng)建一個空的雙隊列
d.append(item) #
在
d
的右邊
(
末尾
)
添加項目
item
d.appendleft(item) #
從
d
的左邊
(
開始
)
添加項目
item
d.clear() #
清空隊列
,
也就是刪除
d
中的所有項目
d.extend(iterable) #
在
d
的右邊
(
末尾
)
添加
iterable
中的所有項目
d.extendleft(item) #
在
d
的左邊
(
開始
)
添加
item
中的所有項目
d.pop() #
刪除并返回
d
中的最后一個
(
最右邊的
)
項目。如果
d
為空,則引發(fā)
IndexError
d.popleft() #
刪除并返回
d
中的第一個
(
最左邊的
)
項目。如果
d
為空,則引發(fā)
IndexError
d.rotate(n=1)#
將
d
向右旋轉(zhuǎn)
n
步
(
如果
n<0,
則向左旋轉(zhuǎn)
)
d.count(n) #
在隊列中統(tǒng)計元素的個數(shù),
n
表示統(tǒng)計的元素
d.remove(n) #
從隊列中刪除指定的值
d.reverse() #
翻轉(zhuǎn)隊列
6.defaultdict
使用dict
時,如果引用的
Key
不存在,就會拋出
KeyError
。如果希望key
不存在時,返回一個默認值,就可以用
defaultdict
·
比如要統(tǒng)計字符串中每個單詞的出現(xiàn)頻率
from collections
import defaultdict
s = 'ilikepython'
#
使用普通字典
frequencies = {}
for
each in s:
frequencies[
each] += 1
#
使用普通字典
frequencie = defaultdict(
int)
for
each in s:
frequencie[
each] += 1
第一段代碼中會拋出一個
KeyError
的異常,
而使用
defaultdict
則不會。
defaultdict
也可以接受一個函數(shù)作為參數(shù)來初始化
:
>>> from collections import defaultdict>>> d = defaultdict(lambda : 0)>>> d['0']0
來源:
博客園