返回目錄 本篇索引 (1)array (2)bisect (3)deque (4)defaultdict (5)namedtuple (6)heapq (7)itertools (1)array array模塊定義一個數組類型:array,它與列表很相似,但它的內容僅限於單一類型。如果需要有效利用存 ...
本篇索引
(1)array
(2)bisect
(3)deque
(4)defaultdict
(5)namedtuple
(6)heapq
(7)itertools
(1)array
array模塊定義一個數組類型:array,它與列表很相似,但它的內容僅限於單一類型。如果需要有效利用存儲空間,那麼就需要用到array模塊。 例如,要存儲1000萬個整數,使用列表需要約160M記憶體,而使用array僅需40M記憶體,代價是array的操作比列表要慢一些。
array數組不適用於數字操作(如矩陣運算),要創建高效存儲和計算的數組,可使用numpy擴展。
“+”運算符用於附加另一個數組的內容,“*”運算符用於重覆附加一個數組。
● array(typecode [,initializer])
說明:
創建類型為typecode的數組,可取類型見下表。initializer是一個字元串或值列表,用於初始化數組中的值。
typecode取值類型
類型編碼 | 描述 | 對應C類型 | 最小大小(位元組數) |
---|---|---|---|
'c' | 8位字元 | Char | 1 |
'b' | 8位整型 | signed char | 1 |
'B' | 8位無符號整型 | unsigned char | 1 |
'u' | Unicode字元 | PY_UNICODE | 2或4 |
''h | 16位整型 | short | 2 |
'H' | 16位無符號整型 | unsigned short | 2 |
'i' | 整型 | int | 4或8(64位架構) |
'I' | 無符號整型 | unsigned int | 4或8(64位架構) |
'l' | 長整型 | long | 4或8(64位架構) |
'L' | 無符號長整型 | unsigned long | 4或8(64位架構) |
'f' | 單精度浮點數 | float | 4 |
'd' | 雙精度浮點數 | double | 8 |
● array實例常用屬性和方法
屬性或方法 | 說明 |
---|---|
a.typecode | 屬性,數組的編碼字元。 |
a.itemsize | 屬性,存儲在數組中項的大小(以位元組為單位)。 |
a.append(x) | 將x附加到數組末尾,若插入類型不匹配,則引發TypeError異常。 |
a.buffer_info() | 返回(address, length)元組,反映數組緩衝區的記憶體位置和長度。 |
a.byteswap() | 切換大端和小端的位元組順序,僅支持整型值。 |
a.count(x) | 返回數組中出現x的次數。 |
a.extend(b) | 將b附加到數組末尾,b也可以是一個數組。 |
a.fromfile(f, n) | 從文件對象f中讀取n個項(二進位格式),並附加到數組末尾。若可讀取的項少於n,則引發EOFError異常。 |
a.fromlist(list) | 將list中的項附加到數組末尾,list可以是可迭代對象。 |
a.fromstring(s) | 將字元串s中的項附加到數組末尾,其中s是一個由二進位值組成的字元串(與fromfile()中格式相同) |
a.index(x) | 返回x在數組中首次出現的位置索引,若未找到,則引發ValueError異常。 |
a.insert(i, x) | 在位置i前插入x。 |
a.pop([i]) | 從數組中刪除項 i 並將其返回。如果i已被刪除,則刪除最後一個元素。 |
a.remove(x) | 從數組中刪除第一個x,若未找到,則引發ValueError異常。 |
a.reverse() | 反轉數組的順序。 |
a.tofile(f) | 將所有項寫入文件f。數據保存為本機二進位格式。 |
a.tolist() | 將數組轉換為普通的值列表。 |
a.tostring() | 將數組轉換為由二進位數據組成的字元串。 |
a.tounicode() | 將數組轉換為Unicode字元串,如果數組類型不為'u',則引發ValueError異常。 |
(2)bisect
bisect模塊可以在已排好順序的列表中插入一個新數據,並使列表維持已排好的順序,它使用二分法來執行大部分工作。
bisect的簡單用例:
s = [1,3,5,7,9] bisect.insort(s, 6) print(s) # 結果為:[1,3,5,6,7,9]
bisect模塊常用函數
屬性或方法 | 說明 |
---|---|
insort(list, item [,low [,high]]) | 將item插入已排序好的列表list中。若item已在列表中,那麼新項將插到現有項的右邊。low和high是兩邊的要檢查子集的邊界。 |
insort_left(list, item [,low [,high]]) | 功能同上,只是若item已在列表中,那麼新項將插到現有項的左邊。 |
insort_right(list, item [,low [,high]]) | 同insort() |
bisect(list, item [,low [,high]]) | 計算如要將item插入到已排序好的的列表list中的插入索引點,並返回這個值。low和high是兩邊的要檢查子集的邊界。若item已在列表中,那麼新計算的插入位置在現有項的右邊。 |
bisect_left(list, item [,low [,high]]) | 功能同上,只是若item已在列表中,那麼新計算的插入位置在現有項的左邊。 |
bisect_right(list, item [,low [,high]]) | 同bisect() |
(3)deque
deque表示雙端隊列(發音:'deck'),要使用雙端隊列需要導入collections模塊。
雙端隊列允許在隊列的任一端插入或刪除項,性能接近O(1)。而列表若要在最前端插入項,需要移動所有後續對象。
若為deque指定了maxlen參數,則向已滿雙端隊列插入新項時,deque會自動在另一端刪除一個數據來騰出空間。
● deque[iterable [,maxlen]])
說明:
iterable是可迭代對象,可用於初始化deque;maxlen表示雙端隊列允許的最大空間。
deque實例常用方法
屬性或方法 | 說明 |
---|---|
d.append(x) | 將x添加到d的右端。 |
d.appendleft(x) | 將x添加到d的左端。 |
d.clear() | 從d中刪除所有項。 |
d.extend(iterable) | 將iterable中的所有項添加到d的右端,以擴展d。 |
d.extendleft(iterable) | 將iterable中的所有項添加到d的左端,iterable中的項將按相反順序出現在d中。 |
d.pop() | 返回並刪除d右端的項。若d為空,則引發IndexError異常。 |
d.popleft() | 返回並刪除d左端的項。若d為空,則引發IndexError異常。 |
d.remove(item) | 刪除首次出現的item,若未找到匹配值,則引發ValueError異常。 |
d.rotate(n) | 將所有項向右旋轉n步,若n為負值,則向左旋轉項。 |
(4)defaultdict
要使用defaultdict需要導入collections模塊。defaultdict與普通字典用法基本一樣,只是在缺少鍵的處理上有不同。當索引不存在的鍵名時,將調用default_factory提供的函數來提供一個預設值,然後將該值保存為鍵的值。其餘操作與內置dict()完全相同。
其實,普通的字典的setdefault()方法也能完成這一功能,只是setdefault()語句結構不是很清晰,且運行速度較慢。
● 初始化語法:
default([default_factory], ...)
用法示例,統計各個單詞出現的位置並將其位置序列放入字典中。
from collections import defaultdict s = 'a b c a b c' word_list = s.split() # word_list值為:['a', 'b', 'c', 'a', 'b', 'c'] dd = defaultdict(list) for i, w in enumerate(word_list): dd[w].append(i) # 最終dd結果為:defaultdict(<class 'list'>, {'a': [0, 3], 'b': [1, 4], 'c': [2, 5]})
(5)namedtuple
namedtuple表示命名元組,要使用namedtuple需要導入collections模塊。在命名元組中,可以使用屬性名稱來訪問元組元素,可以動態增加新屬性。缺點是比普通元組慢一點。
● 初始化語法:
namedtyple(typename, filednames [,verbose])
typename作為新創建的命名元組名稱(它是tuple的子類),fieldnames是字元串形式的屬性名稱的列表,不能以下劃線開頭。fieldnames也可寫成一個字元串,各屬性間用空格或逗號分隔。verbose標記若設為True,將向標準輸出端輸出生成的類定義。
使用命名元組的簡單示例:
from collections import namedtuple NewAddrPort = namedtuple('NewAddrPort', ['ipaddr', 'port']) a = NewAddrPort('127.0.0.1', 80) print(a.ipaddr, a.port) # 結果為:'127.0.0.1' 80 ipaddr, host = a # 本句可將命名元組a像普通元組那樣解包展開。 isinstance(a, tuple) # 結果為:True
如果定義一個僅作為數據結構的對象,那可以用命名元組來替代:
class Square(object): def __init(self, l, w): self.l = l self.w = w # 可以用命名元組來替代: import collections Square = collections.namedtuple('Square', 'l w') nt = Square(10, 20)
使用命名元組的優點是:可以像實例那樣來訪問屬性,如:nt.l、nt.w;也可以對nt像普通元組那樣使用for語句和解包語句。
(6)heapq
heapq模塊使用堆實現一個優先順序隊列。優先順序隊列能以任意順序添加對象,並能隨時找出最小的元素,它比列表的min方法要快得多。
heapq模塊常用函數
函數 | 說明 |
---|---|
heapify(x) | 將列表x原地轉換為堆。 |
heappop(heap) | 返回並刪除heap中最小的項,若heap為空,則引發IndexError異常。 |
heappush(heap, item) | 將item添加到堆中。 |
heappushpop(heap, item) | 在一個操作中將item添加到堆並從heap中刪除最小項。這比分別調用heappush()和heappop()更高效。 |
heapreplace(heap, item) | 返回並刪除堆中最小的元素,並同時添加一個新item。新項的添加在獲取返回值之後,因此返回值可能比item更大。若heap為空,則引發IndexError異常。 |
merge(s1, s2, ...) | 創建一個迭代器,將有序的迭代變數s1, s2等合併到一個有序序列中。 |
nlargest(n, iter [,key]) | 創建一個列表,包含iter中最大的n個項,最大項排在返回列表的前端。key是可選參數,接受一個輸出參數並計算iter中每個項的比較鍵。 |
nsmallest(n, iter [,key]) | 創建一個列表,包含iter中最小的n個項,最小項排在返回列表的前端。key含義同上。 |
heap用法示例:
import heapq x = [1,9,2,8,3,7,4,6] heapq.heapify(x) # 本句運行後,x已變成優先順序隊列 print(x) >>> [1,3,2,6,8,7,4,9] # x已按堆的優先順序排序好 heapq.heappop(x) >>> 1 heapq.heappop(x) >>> 2
(7)itertools
itertools模塊包含創建高效迭代器的函數,可以用各種方式對數據執行迴圈操作。
itertools模塊常用函數
函數 | 說明 |
---|---|
chain(iter1, iter2, ..., iterN) | 此函數創建一個新迭代器將所有入參迭代器鏈接起來,返回的迭代器從iter1的第1項開始,到iterN的最後一項。 |
chain.from_iterable(iterables) | 一個備用鏈構造函數。 |
combinations(iter, r) | 創建一個迭代器,返回iter中所有長度為r的子序列。例如:combinations([1,2,3], 2)生成的序列為:[1,2]、[1,3]、[2,3]。 |
count([n]) | 創建一個迭代器,生成從n開始的連續整數,如果忽略n則從0開始。如果超出了系統的最大正整數範圍,則從系統最小負整數-1繼續。 |
cycle(iter) | 創建一個迭代器,對iter中的元素反覆執行迴圈操作,生成一個迭代器副本。 |
dropwhile(predicate, iter) | 創建一個迭代器,只要函數perdicate(item)為True,就丟棄iter中的項,若為False則存入此項到新迭代器。 |
filterfalse() | 創建一個迭代器,僅生成iter中predicate(item)為False的項,若predicate為None,將返回iter中所有計算為False的項。 |
groupby(iter, [,key]) | 創建一個迭代器,對iterable生成的連續項進行分組,在分組過程中會查找重覆項。 |
islice(iter [,start], stop [,step]) | 創建一個迭代器,生成的項類似於切片返回值:iter[start:stop:step],但start, stop, step都不能使用負值。 |
permutations(iter [,r]) | 創建一個迭代器,返回iter中所有長度為r的序列,若省略r,那麼序列長度與iter中的項數相同。 |
product(iter1, iter2, ..., iterN, [repeat=1]) | 創建一個迭代器,生成表示item1, item2等中的項的笛卡爾積的元組。repeaet指定重覆生成序列的次數。 |
repeat(object [,times]) | 創建一個迭代器,重覆生成object。times指定重覆計數,如果未指定times,將無止盡地返回該對象。 |
starmap(func [,iter]) | 創建一個迭代器,生成值未func(*item),只有當iter生成的項適合用於這種調用函數的方式時,此函數才有效。 |
takewhile(predicate [,iter]) | 創建一個迭代器,深禪iter中predicate(item)未True的項,只要predicate計算未False,迭代就會立刻停止。 |
tee(iter [,n]) | 從iter創建n個獨立的迭代器,創建的迭代器以n元組的形式返回,n的預設值為2。 |
迭代器使用的一些示例:
from itertools import * # 在數字0,1,...,10,9,8,...,1上無限迴圈 for i in cycle(chain(range(10), range(10,0-1))): print(i) # 創建a中的唯一項列表 a = [1,2,3,4,2,3,4,5] a.sort() b = [k for k,g in groupby(a)] # b = [1,2,3,4,5] # 對x和y中所有可能的值對進行組合迭代 x = [1,2,3] y = [10,11] for r in product(x,y): print(r) # 生成輸出:(1,10), (1,11), (2,10), (2,11), (3,10), (3,11)