Python 基础
Python带条件判断的赋值语句
在学C++的时候存在一种一句,a ? b : c。若a为真,返回b,否则返回c。在Python中有多种不同的表达方式。
赋值语句中的if
123 if True else 321 Out[5]: 123 123 if False else 321 Out[6]: 321
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- 赋值语句中的 and 和 or
- ```python
10 or 20
Out[7]: 10
10 and 20
Out[8]: 20
0 or 1
Out[9]: 1
0 and 1
Out[10]: 0短路运算符规则:
- 表达式从左至右运算。
- 若 or 的左侧逻辑值为 True , 则短路右侧,返回 or 左侧表达式。若从左到右一直是False,即返回最后一个False。
- 若 and 的左侧逻辑为 False , 则短路右侧,返回 and 左侧表达式。若从左到右一直为True,即返回最后一个True。
1 and True and 3 and False Out[19]: False 1 and True and 3 and 0 Out[20]: 0
1
2
3
4
5
6
7
8
9
10
- Tip: 不建议使用,会伤害可读性。
- 索引条件赋值
- 将bool值作为整型索引
- ```python
(1,2)[True]
Out[22]: 2
类型的布尔判断
(None or int)('12345') Out[26]: 12345 (str or int)('12345') Out[27]: '12345'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
## Python dict
- key value 基础:
- key 唯一,是不可变的,比如字符串、数子或者元组。故dict可以作为hashTable来使用,数字也可以作为dict的key。
- value 可为任意数据类型。
- 布尔判断
# Python 内置数据结构、函数及操作符
## 数据结构
### 集合 set
1. 创建
1. ```python
# 创建空集合
s = set()
# 创建有元素集合
s = {para1, para2,...}
s = set([para1,para2,...]) # set([iterable]) 比如说 string, list
集合计算
>>> a = set('abracadabra') >>> b = set('alacazam') >>> a {'a', 'r', 'b', 'c', 'd'} # 差集 difference >>> a - b # 集合a中包含而集合b中不包含的元素 {'r', 'd', 'b'} # 并集 union >>> a | b # 集合a或b中包含的所有元素 {'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'} # 交集 intersection >>> a & b # 集合a和b中都包含了的元素 {'a', 'c'} # 对称差 symmetric difference >>> a ^ b # 不同时包含于a和b的元素 {'r', 'd', 'b', 'm', 'z', 'l'}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
3. 集合的基本操作
```python
# 添加元素
s.add(x) # 在 set 中添加 x
# 添加元素 2
s.update(l1,l2) # 在 set 中添加多个元素,参数可以是列表、元组、字典
# 删除
s.remove(x) # x 不存在会报错
# 删除 2
s.remove(x) # x 不存在不会报错
# 清空
s.clear() # 清空集合
Priority Queue
priority queue 基础
Dict 字典
dict.get(key, default = None)
OrderedDict
有顺序的 dict, 基本是 stack + dict 的结合体
1 | popitem(last=True) |
内置函数
zip
1 | DBabichev |
iter
we can implement iterator using _iter_\
- 遍历用法
1 | for element in iterable: |
in 用法,作为快慢指针使用
1
2
3
4
5
6
7def findLongestWord(self, s: str, d: List[str]) -> str:
d.sort(key = lambda x: (-len(x), x))
for word in sorted(d, key = lambda x : (-len(x), x)) :
iter_s = iter(s)
if all( c in iter_s for c in word) :
return word- iter() 返回 一个 iterator
- ele in iter_s : 执行 next(iter_s) 直到找到 ele,返回 true,iterator 指向下一个。
- 如果没有找到:next 执行到尾部之后,或者 iter_s 已经在尾部之后,返回 true。
ord
ord(‘$’): f返回与当前符号作为 Unicode 所对应的整数。
map
1 | map(function, iterables) |
1 | def myfunc(a, b): |
range
range
range(start, stop[, step])
1
2
3
4
5
### pow
1. ```python
pow(a,b) # 求 a^b 的数值
reversed()
re
sort()
list.sort([reverse = …]) : inplace 对 list 进行 ascending 排序
sort(list): 返回 sort 的结果
key = lambda x: x.val
使用 lambda 函数作为排序的 key
functools.cmp_to_key
1 | from functools import cmp_to_key |
操作符
示例 :
1 | a = 0011 1100 |
赋值 ==
1 | a = b = [0, 1, 2] |
将同一个对象赋值给多个 variables
ASCII 转化
- ord() 和 chr() 之间的相互转化
1 | ord('a') = 97 |
符 | 描述 | 实例 |
---|---|---|
& | 按位与运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0 | (a & b) 输出结果 12 ,二进制解释: 0000 1100 |
| | 按位或运算符:只要对应的二个二进位有一个为1时,结果位就为1。 | (a | b) 输出结果 61 ,二进制解释: 0011 1101 |
^ | 按位异或运算符:当两对应的二进位相异时,结果为1 | (a ^ b) 输出结果 49 ,二进制解释: 0011 0001 |
~ | 按位取反运算符:对数据的每个二进制位取反,即把1变为0,把0变为1。**~x** 类似于 -x-1 | (~a ) 输出结果 -61 ,二进制解释: 1100 0011, 在一个有符号二进制数的补码形式。 |
<< | 左移动运算符:运算数的各二进位全部左移若干位,由”<<”右边的数指定移动的位数,高位丢弃,低位补0。 | a << 2 输出结果 240 ,二进制解释: 1111 0000 |
>> | 右移动运算符:把”>>”左边的运算数的各二进位全部右移若干位,”>>”右边的数指定移动的位数 | a >> 2 输出结果 15 ,二进制解释: 0000 1111 |
mod
1 | a % b |
否定符号
!(exclamation mark)在 python 不适用。
使用 not 来作为所有想用 ! 时候的否定符号。
科学计数法
1 | 2*(10^9) : 2e9 |
逻辑运算符 and or
除了 bool 运算的返回值
1 | 10 a = |
Python string
isdecimal, isdigit, isnumeric 的区别
区别如下表所示,通常我们判断是否为一个数值,使用 isdigit() 看起来比较适用。
1 | +-------------+-----------+-------------+----------------------------------+ |
Python List
二维列表初始化
如果按照l=[[0]*m]*n 的方式赋值,得到的结果是指向[0]*m的n个指针。所以如果对l[p][q]=0这样赋值,会对所有list的index为q的位置进行赋值。
所以要按照一种新方法进行赋值
l = [[0]*m for _ in range(n)]
1
2
3
4
5
6
7
8
## 列表解析
使用列表 filter 来进行新列表赋值。
```python
[expr for iter_val in iterable if cond_expr]
”+“ 操作符 —— 列表链接
1 | a = [1,2,3] |
按照第一个元素进行排序
sort in_place
按照第一个元素进行 sort
t.sort(key = lambda x: x[0])
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
3. sorted(list):返回值就是按照第一个元素
4. reversed : reverse = True 降序,reverse = False 升序
## 删除元素
- Remove all items: `clear()`
- Remove an item by index and get its value: `pop()`
- Remove an item by value: `remove()`
- Remove items by index or slice: `del`
- Remove items that meet the condition: List comprehensions
# Python 数据结构实现
## Queue
1. 数据结构特性: First In First Out
2. 数据操作:
1. Enqueue : add an item to the queue, overflow should be warned
2. Dequeue: remove an item from the queue, underflow should be warned
3. Front: get the front item 最早被压入队列的元素
4. Rear: get the last item 最后被压入队列的元素
3. 实现方式
1. Python list
2. collection.deque
1. ```python
from collections import deque
# Initializing a queue
q = deque()
# Adding elements to a queue
q.append('a')
q.append('b')
q.append('c')
print("Initial queue")
print(q)
# Removing elements from a queue
print("\nElements dequeued from the queue")
print(q.popleft())
print(q.popleft())
print(q.popleft())
print("\nQueue after removing elements")
print(q)
# output
Initial queue
deque(['a', 'b', 'c'])
Elements dequeued from the queue
a
b
c
Queue after removing elements
deque([])queue.Queue
build - in Python function
functions:
# initiate q = Queue(maxsize = 3) # add element to the queue q.put('a') # get element from the queue q.get() # 'a' FIFO
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
3. Example
```python
# Python program to
# demonstrate implementation of
# queue using queue module
from queue import Queue
# Initializing a queue
q = Queue(maxsize = 3)
# maxmize is the initial size of the queue
# maxmize = 0: this is an infinite queue
# qsize() give the maxsize
# of the Queue
print(q.qsize()) # 0
# Adding of element to queue
q.put('a')
q.put('b')
q.put('c')
# Return Boolean for Full
# Queue
print("\nFull: ", q.full()) # Full: True
# Removing element from queue
print("\nElements dequeued from the queue")
print(q.get()) # a
print(q.get()) # b
print(q.get()) # c
# Return Boolean for Empty
# Queue
print("\nEmpty: ", q.empty()) # Empty: True
q.put(1)
print("\nEmpty: ", q.empty()) # Empty: False
print("Full: ", q.full()) # Full: False
# This would result into Infinite
# Loop as the Queue is empty.
# print(q.get())
PriorityQueue
1 | from heapq import * |
heapq 中没有接受 key 排序函数的 feature,可以使用(key, task)的符合键来完成排序与 task 不一致的任务。
Tricks
三个布尔变量,有两个或者两个以上为True才返回为True
1 | (b||c) if a else (b && c) |
1 | a if a == b else c |
- Attention: None != False
Python 常用函数
内置
vector 初始化
给定vector规模的vector初始化。
vector<int> m(cost.size() + 1); // 长度为cost.size()+1, 元素都为0的vector vector<vector<vector<strig>>> dp(n) ; //仅指定第第一维的大小
1
自增运算符的区别
a ++ : 先返回,后自增
++ a:先自增,后返回
例子
int a = 20 c = a ++ // c - 20, a - 21 b = ++ a // b - 22,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
## 队列 queue
1. 基本操作
1. 入队,如例:q.push(x); 将x接到队列的末端
2. 出队,如例:q.pop(); 弹出队列的第一个元素,注意,并不会返回被弹出元素的值。
3. 访问队首元素,如例:q.front(),即最早被压入队列的元素。
4. 访问队尾元素,如例:q.back(),即最后被压入队列的元素。
5. 判断队列空,如例:q.empty(),当队列空时,返回true。
6. 访问队列中的元素个数,如例:q.size()
## C++ string substr()
1. 成员函数
1. ```c++
string substr (size_t pos = 0, size_t len = npos) const;
// para1:子串开始位置,para2:子串长度
神奇的位操作
判断一个数是否为 2 的幂:
- num &(num - 1) == 0
常用的库
Math
comb(a, b) 计算组合数
1 | from math import comb |
collection
Counter
1 | ''' |
OrderedDict
1 | dic = OrderedDict() |
Bisect
用于数组二分查找算法的调用
1 | bisect.bisect_left(a, x, lo=0, hi=len(a)) # 返回左插入点 |
1 | def find_gt(a, x): |
random
1 | import random |
itertools
1 | # production |
Pandas
map(), apply() and applymap()
map()
Python built-in function:
1 | def myfunc(a, b): |
apply()
pandas.DataFrame.apply, pandas 函数,将整行或者整列传入进行处理。
DataFrame.``apply
(**func,** axis=0**,** raw=False**,** result_type=None**,** args=()**,**kwds)
1 | df |
applymap()
elementwise, 以每单个元素传入进行处理。
DataFrame.``applymap
(**func,** na_action=None**)**
1 | 0 1 |
其他参考
Python 常用操作的时间复杂度
ref: https://www.ics.uci.edu/~brgallar/week8_2.html
Python 为什么不能给 integer 一个指针
Python 中的 integer 是 immutable 的 https://stackoverflow.com/questions/15148496/passing-an-integer-by-reference-in-python