Python標準庫(待續)

arrowhalo發表於2018-08-08

相識一場,記得頂我


集合操作

並集
>>> a = set([1,2,3])
>>> b = set([2,3,4])
>>> a.union(b)
{1, 2, 3, 4}
>>> a|b
{1, 2, 3, 4}
交集
>>> a = set([1,2,3])
>>> b = set([2,3,4])
>>> a.intersection(b)
{2, 3}
>>> a&b
{2, 3}
子集歸屬
>>> c = a&b
>>> c.issubset(a)
True
>>> c<=b
True
>>> c<=a
True
>>> c>=a
False
因為集合是可變的,但是集合本身包含的是不可變物件,所以以下程式碼會報錯。
>>> a = set([1,2,3])
>>> b = set([2,3,4])
>>> a.add(b)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: `set`
這時候我們需要使用frozenset型別,用於代表不可變的集合,它會建立一個副本物件加入到集合中。
>>> a.add(frozenset(b))
>>> a
{1, 2, 3, frozenset({2, 3, 4})}
堆操作

堆是一種資料結構,它是優先佇列的一種,它在查詢方面比列表的效率要高得多。

heappush(heap,x) 入堆
heappop(heap) 出堆
heapify(heap) 把可迭代物件轉換為堆
heapreplace(heap,x) 將堆中最小元素彈出,同時將x入堆
nlargest(n,iter) 找出可迭代物件中第n大元素
nsmallest(n,iter) 找出可迭代物件中第n小元素

>>> from heapq import *
>>> from random import shuffle
>>> data = range(10)
>>> shuffle(data)
>>> heap = []
>>> for n in data:
       heappush(heap,n)
>>> heap
[0, 2, 1, 3, 5, 7, 4, 6, 9, 8]
>>> heappop(heap)
0
>>> heappop(heap)
1
>>> heappop(heap)
2
>>> heappop(heap)
3
>>> heap
[4, 5, 7, 6, 9, 8]
-----------------------------------------
>>> heap = [9,7,2,4,5,6,2,3,1]
>>> heapify(heap)
>>> heap
[1, 3, 2, 4, 5, 6, 2, 7, 9]
-----------------------------------------
>>> heapreplace(heap,0.5)
1
>>> heap
[0.5, 3, 2, 4, 5, 6, 2, 7, 9]

從上述程式碼執行的結果可以看出,這是一個小根堆的排序演算法—位於i位置上的元素總比i/2位置處的元素大,反過來也就是i位置處的元素總比2i和2i+1位置處的元素小。

雙端佇列
>>> from collections import deque
>>> q = deque(range(5))
>>> q.append(5)
>>> q.appendleft(6)
>>> q
deque([6, 0, 1, 2, 3, 4, 5])
>>> q.pop()
5
>>> q.popleft()
6
>>> q
deque([0, 1, 2, 3, 4])
>>> q.rotate(2)
>>> q
deque([3, 4, 0, 1, 2])
>>> q.extend([3,4])
>>> q
deque([3, 4, 0, 1, 2, 3, 4])
>>> q.extendleft([2,1])
>>> q
deque([1, 2, 3, 4, 0, 1, 2, 3, 4])

從上述程式碼可以看出雙端佇列的好處在於它可以在列表的兩端進行操作和旋轉列表。

time

可以使用實數表示,也可以使用包含9個整數的元組表示。如果使用元組表示,那這些整數的意義如下:
(2018,1,21,10,28,30,2,21,0)
表示2018年1月21日,10時28分30秒,星期3,當天為當年的第21天,(無夏令時)

asctime([tuple]) 將時間元組轉換為字串
localtime([secs])將秒數轉換為日期元組,以本地時間為準
mktime(tuple)將時間元組轉換為本地元組
sleep(secs)休眠
strptime(string[,format])將字串解析為時間元組
time()當前時間
`Wed Jul 11 10:02:04 2018`

random

random() 返回0<n<=1之間的隨機實數n
getrandbits(n) 以長整型形式返回n個隨機位 (加密有用)
uniform(a,b) 返回隨機實數n,其中a<=n<b,(a,b)之間的均勻分佈
randrange([start],stop,[step]) 返回range(start,stop,step)中的實數
choice(seq)從序列seq中返回隨意元素
shuffle(seq[,random])原地指定序列
seqsample(seq,n) 從序列seq中選擇n個隨機且獨立的元素

re

re模組是一個正規表示式的模組

compile(pattern[,flags]) 根據包含正規表示式的字串建立模式物件
search(pattern, string[,flags])在字串中尋找模式
match(pattern,string[,flags]) 在字串的開始處匹配模式
split(pattern,string[,maxsplit=0])根據模式的匹配來分割字串
findall(pattern,string) 列出字串中模式的所有匹配項
sub(pat,repl,string[,count=0])將字串中所有pat的匹配項用repl替換
escape(string) 將字串中所有特殊正規表示式字元轉義

用任意長度的逗號和空格序列來分割字串

some_text = `alpha,beta,,,,gamma delta`
re.split(`[, ]+`,some_text)
[`alpha`, `beta`, `gamma`, `delta`]


相關文章