python內建模組collections介紹

2022-03-03 18:07:54 字數 4433 閱讀 1498

目錄collections是python內建的乙個集合模組,提供了許多有用的集合類。

python提供了很多非常好用的基本型別,比如不可變型別tuple,我們可以輕鬆地用它來表示乙個二元向量。

>>> v = (2,3)
我們發現,雖然(2,3)表示出了乙個向量的兩個座標,但是,如果沒有額外說明,又很難直接看出這個元組是用來表示乙個座標的。

為此定義乙個class又小題大做了,這時,namedtuple就派上用場了。

>>> from collections import namedtuple

>>> vector = namedtuple('vector', ['x', 'y'])

>>> v = vector(2,3)

>>> v.x

2>>> v.y

3

namedtuple是乙個函式,它用來建立乙個自定義的tuple物件,並且規定了tuple元素的個數,並可以用屬性而不是索引來引用tuple的某個元素。

這樣一來,我們用namedtuple可以很方便地定義一種資料型別,它具備tuple的不變性,又可以根據屬性來引用,使用十分方便。

我們可以驗證建立的vector物件的型別。

>>> type(v)

>>> isinstance(v, vector)

true

>>> isinstance(v, tuple)

true

類似的,如果要用座標和半徑表示乙個圓,也可以用namedtuple定義:

>>> circle = namedtuple('circle', ['x', 'y', 'r'])

# namedtuple('名稱', [『屬性列表』])

在資料結構中,我們知道佇列和堆疊是兩個非常重要的資料型別,乙個先進先出,乙個後進先出。在python中,使用list儲存資料時,按索引訪問元素很快,但是插入和刪除元素就很慢了,因為list是線性儲存,資料量大的時候,插入和刪除效率很低。

deque是為了高效實現插入和刪除操作的雙向鍊錶結構,非常適合實現佇列和堆疊這樣的資料結構。

>>> from collections import deque

>>> deq = deque([1, 2, 3])

>>> deq

deque([1, 2, 3, 4])

>>> deq

deque([5, 1, 2, 3, 4])

>>> deq.pop()

4>>> deq.popleft()

5>>> deq

deque([1, 2, 3])

使用dict字典型別時,如果引用的key不存在,就會丟擲keyerror。如果希望key不存在時,返回乙個預設值,就可以用defaultdict。

>>> from collections import defaultdict

>>> dd = defaultdict(lambda: 'defaultvalue')

>>> dd['key1'] = 'a'

>>> dd['key1']

'a'>>> dd['key2'] # key2未定義,返回預設值

'defaultvalue'

注意預設值是呼叫函式返回的,而函式在建立defaultdict物件時傳入。

除了在key不存在時返回預設值,defaultdict的其他行為跟dict是完全一樣的。

使用dict時,key是無序的。在對dict做迭代時,我們無法確定key的順序。

但是如果想要保持key的順序,可以用ordereddict。

>>> from collections import ordereddict

>>> d = dict([('a', 1), ('b', 2), ('c', 3)])

>>> d # dict的key是無序的

>>> od = ordereddict([('a', 1), ('b', 2), ('c', 3)])

>>> od # ordereddict的key是有序的

ordereddict([('a', 1), ('b', 2), ('c', 3)])

注意,ordereddict的key會按照插入的順序排列,不是key本身排序

>>> od = ordereddict()

>>> od['z'] = 1

>>> od['y'] = 2

>>> od['x'] = 3

>>> list(od.keys()) # 按照插入的key的順序返回

['z', 'y', 'x']

ordereddict可以實現乙個fifo(先進先出)的dict,當容量超出限制時,先刪除最早新增的key。

from collections import ordereddict

class lastupdatedordereddict(ordereddict):

def __init__(self, capacity):

super(lastupdatedordereddict, self).__init__()

self._capacity = capacity

def __setitem__(self, key, value):

containskey = 1 if key in self else 0

if len(self) - containskey >= self._capacity:

last = self.popitem(last=false)

print('remove:', last)

if containskey:

del self[key]

print('set:', (key, value))

else:

print('add:', (key, value))

ordereddict.__setitem__(self, key, value)

chainmap可以把一組dict串起來並組成乙個邏輯上的dict。chainmap本身也是乙個dict,但是查詢的時候,會按照順序在內部的dict依次查詢。

什麼時候使用chainmap最合適?舉個例子:應用程式往往都需要傳入引數,引數可以通過命令列傳入,可以通過環境變數傳入,還可以有預設引數。我們可以用chainmap實現引數的優先順序查詢,即先查命令列引數,如果沒有傳入,再查環境變數,如果沒有,就使用預設引數。

下面的**演示了如何查詢user和color這兩個引數。

from collections import chainmap

import os, argparse

# 構造預設引數:

defaults =

# 構造命令列引數:

parser = argparse.argumentparser()

parser.add_argument('-u', '--user')

parser.add_argument('-c', '--color')

namespace = parser.parse_args()

command_line_args =

# 組合成chainmap:

combined = chainmap(command_line_args, os.environ, defaults)

# 列印引數:

print('color=%s' % combined['color'])

print('user=%s' % combined['user'])

沒有任何引數時,列印出缺省引數:

$ python3 use_chainmap.py 

color=red

user=guest

當傳入命令列引數時,優先使用命令列引數:

$ python3 use_chainmap.py -u bob

color=red

user=bob

同時傳入命令列引數和環境變數,命令列引數的優先順序較高:

$ user=admin color=green python3 use_chainmap.py -u bob

color=green

user=bob

counter是乙個簡單的計數器,例如,統計字元出現的個數:

from collections import counter

>>> s = 'abbcccdddd'

>>> counter(s)

counter()

counter實際上也是dict的乙個子類。

collections模組提供了一些有用的集合類,可以根據需要選用。

python內建模組 Python 內建模組

內建模組 python有一套很有用的標準庫 standard library 標準庫會隨著python直譯器,一起安裝在你的電腦中的。它是python的 乙個組成部分。這些標準庫是python為你準備好的利器,可以讓程式設計事半功倍。常用標準庫 標準庫 說明 builtins 內建函式預設載入 os...

Python內建模組

os.remove 刪除檔案 os.unlink 刪除檔案 os.rename 重新命名檔案 os.listdir 列出指定目錄下所有檔案 os.curdir 返回當前目錄 os.pardir 獲取當前目錄的父目錄字串名 os.chdir 改變當前工作目錄 os.getcwd 獲取當前檔案路徑 os...

python內建模組

time模組 時間戳time.time 列印出的是秒數,從1970年開始算 time.localtime 顯示的是結構化時間,當地時間 time.gmtime 顯示的也是結構化時間,不過是世界標準時間 將結構化時間轉換成時間戳,time.mktime time.localtime 將結構化時間轉換成...