# python筆記
## 演算法模板Algorithm
### deque
deque(全名double-ended queue),為一種兩端都可以放入,取出元素的資料結構。
| 尾部插入 | 頭部插入 | 尾部刪除 | 頭部刪除 |
| -------- | ---------- | -------- | -------- |
| append | appendleft | pop | popleft |
```python=
# deque實作queue的用法
q = deque()
q.append()
q.popleft()
```
### priority queue
預設是min-heap,也就是會按照小到大排序。
若要實作max-heap,可將元素x以-x的方式放入pq,取出元素時加個負號即可取出最大元素。
```python=
pq = []
heappush(pq, element)
element = heappop(pq)
```
### defaultdict
內置參數: int, list, set, dict
```python=
better_dict = defaultdict(list) # default值以一個list()方法產生
better_dict['a'].append(1) # [1]
better_dict['a'].append(2) # [1,2]
better_dict['a'].append(3) # [1,2,3]
```
#### 查看多個字典中,共有幾種不同的字典值
```python=
unique_dicts = set()
for d in dicts:
dict_tuple = tuple(sorted(d.items())) # 將字典轉換為排序過的tuple
unique_dicts.add(dict_tuple)
print(len(unique_dicts))
```
### 字典樹 Trie
為一種有序樹,通常用來存放字串,鍵值(字元)存放在節點中。
```python=
class Node:
def __init__(self):
# self.cnt_prf = 0
self.children = collections.defaultdict(Node)
class Trie:
def __init__(self):
self.root = Node()
def insert(self, word: str) -> None:
node = self.root
for c in word:
node = node.children[c]
# node.cnt_prf += 1
```
### format string
```python=
h, m = 13, 57
formatted_num = "{:02d}:{:02d}".format(h, m) # 02d代表要輸出長度為2的字串
print(formatted_num) # 输出: '13:57'
```
### itertools
```python=
original_list = [1, 2, 3]
all_combinations = []
for r in range(len(original_list) + 1):
combinations_r = itertools.combinations(original_list, r)
all_combinations.extend(combinations_r)
# [(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]
```
```python=
original_list = [1, 2, 3]
permutations_3 = itertools.permutations(original_list, 3)
# [(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]
```
### 排列組合
```python=
def C(n, k): # 組合
if k > n or k < 0:
return 0
return math.factorial(n) // (math.factorial(k) * math.factorial(n - k))
def P(n, k): # 排列
if k > n or k < 0:
return 0
return math.factorial(n) // math.factorial(n - k)
def H(n, k): # 重複組合
return C(n+k-1, k)
```
### binary search
```python=
l, r = 0, len(nums)
while l < r:
mid = (l+r)//2
if nums[mid] > target:
r = mid
elif nums[mid] < target:
l = mid+1
else:
return mid
return -1
```
## 虛擬環境Virtual Environment
以下介紹的為python原生的venv,除此之外還有conda等虛擬環境可以使用。
### 建立虛擬環境
name_env為安裝虛擬環境的資料夾名稱
```bash=
python3 -m venv name_env
```
接著當前目錄下應該會出現一個資料夾裡頭有著虛擬環境的檔案。當不再需要用到虛擬環境時,可直接將/name_env資料夾刪除即可。
### 啟用虛擬環境
```bash=
source name_env/bin/activate
```
如果命令列最前面出現(name_env),即代表成功開啟了虛擬環境
### 查看虛擬環境位址
```bash=
which python3
```
### 套件管理
查看已有什麼套件
```bash=
pip3 list
```
下載&更新套件。若不指定版本的話,會預設下載最新版本。
```bash=
pip3 install package_name
pip3 install package_name==version
pip3 install --upgrade package_name
```
刪除套件
```bash=
pip3 uninstall package_name
```
### 關閉虛擬環境
```bash=
deactivate
```