相識一場,記得頂我
集合操作
并集
>>> 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']