Python3之內置模組collections

2022-06-24 09:30:13 字數 3974 閱讀 6677

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

namedtuple

我們知道tuple可以表示不可變集合,例如,乙個點的二維座標可以表示成

>>> p=(1,2)

但是,看到(1, 2),很難看出這個tuple是用來表示乙個座標的。

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

>>> from collections import namedtuple

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

>>> p=point(1,2)

>>> p.x

1>>> p.y

2

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

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

可以驗證建立的point物件是tuple的一種子類:

>>> isinstance(p,point)

true

>>> isinstance(p,tuple)

true

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

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

>>> c=circle(1,2,1)

deque

使用list儲存資料時,按索引訪問元素很快,但插入和刪除元素就慢了,因為list是線性儲存,資料量大的時候,插入和刪除效率很低。

deque是為了高效實現插入和刪除操作的雙向列表,適合用於佇列和棧:

>>> from collections import deque

>>> q=deque(['a','b','c'])

>>> q

deque(['y', 'a', 'b', 'c', 'x'])

defaultdict 

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

>>> from collections import defaultdict

>>> dd=defaultdict(lambda:'n/a')

>>> dd['key1']='abc'

#key1儲存在返回

>>> dd['key1']

'abc'

#key2不存在返回自定義的預設值

>>> dd['key2']

'n/a'

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

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

ordereddict

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

如果要保持key的順序,可以使用ordereddict

>>> from collections import ordereddict

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

#d是無序的

>>> d

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

#od是有序的

>>> od

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

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

>>> od=ordereddict()

>>> od['z']=1

>>> od['y']=2

>>> od['x']=3

>>> od.keys()

odict_keys(['z', 'y', 'x'])

#按照插入的key的順序返回

>>> list(od.keys())

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

chinamap

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

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

下面的**演示了如何查詢usercolor這兩個引數:

use_chinamap.py

#!/usr/bin/env python3

# -*- coding: utf-8 -*-

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 =

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 zhangsan

color=red

user=zhangsan

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

user=admin color=green python3 use_chainmap.py -u zhangsan

color=green

user=zhangsan

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

>>> from collections import counter

>>> c=counter()

>>> for ch in 'prohramming':

... c[ch]=c[ch]+1

...

>>>

>>> c

counter()

counter實際上也是dict的乙個子類,上面的結果可以看出,字元'g''m''r'各出現了兩次,其他字元各出現了一次。

python 之內置模組

裝飾器 def trace func result func args,kwargs print s r,r r func.name args,kwargs,result return result trace 裝飾器含義就是 fibonacci trace fibonacci def fibona...

Python3 內建模組 os

方法名 說明os.access 判斷檔案許可權 os.chdir 改變當前工作目錄 os.chmod file 修改檔案許可權 os.execvp 啟動乙個新程序 os.execvp 執行外部程式指令碼 uinx os.fork 獲取父程序id,在子程序返回中返回0 os.getcwd 獲取當前檔案...

Python3內建模組random隨機方法小結

前言 random是python中與隨機數相關的模組,其本質就是乙個偽隨機數生成器,我們可以利用random模組基礎生成各種不同的隨機數,以及一些基於隨機數的操作。生成隨機數相關 生成0 1之間的浮點數 import random r random.random print r r random.r...