學校教的程式語言是C,C++和Python我是自學的,C++和C除了些微的語法不同,以及多了很多工具,兩者的結構很接近,所以我學C++挺快上手,只需要理解STL怎麼運用即可。但Python就不太一樣,語法不同,結構也和C不太一樣,所以我想藉由這篇文章記錄一下若要用Python做一些事情應該要怎麼下指令,不只是記錄,也順便拿題目來練習,現學現用也增加對Python的手感。

Python輸出不換行

Python的print預設會將內容輸出後換一行,如果不要換行,則要在後面加上end=’’。

實戰演練

b971 等差數列為例

1
2
3
4
5
ae, an, d = map(int, input().split())
if d<0:
an-=2
for i in range(ae, an+1, d):
print(i,end=' ')

如果最後一行是print(i)的話,那測資輸入1 9 2,會輸出。

1
2
3
4
5
1
3
5
7
9

加上end=’ ‘,輸出變成。

1
1 3 5 7 9

Python宣告陣列

實戰演練

c276 沒有手機的下課時間為例。

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
arr=[]
# 規劃10個int的空間給arr
for j in range(10):
arr.append(0)
ans=int(input())
n=int(input())
for i in range(n):
guess=int(input())
a,b,op=0,0,ans
# 初始化arr
for j in range(10):
arr[j]=0
# 比較A
while op>0:
arr[guess%10]+=1;arr[op%10]+=1
if guess%10==op%10:
a+=1
guess//=10;op//=10
# 比較B
for j in range(10):
if arr[j]==2:
b+=1
b-=a
# 結果
print('%dA%dB'%(a,b))

對Python的list排序可以使用sort函數

預設為小排到大,格式為:

list.sort(cmp=None, key=None, reverse=False)
cmp︰ 指定一個比較函式的話,會使用該比較函式進行排序
key︰ 指定元素的某一列為key鍵值, 也就是按照元素的某一列來進行排序
reverse︰排序規則,reverse=True 降序,reverse=False 升序(預設)。

Python的EOF寫法

1
2
3
4
5
while 1:
try:
...
except EOFError:
break

或是

1
2
3
4
5
try:
while 1:
...
except EOFError:
break

意同於C或C++的while(…!=EOF){…}

list(map(int,input().split()))

如果想和C、C++一樣可以每行都輸入不同數量的變數,可以使用list(map(int,input().split())),它會自動將某行輸入依照split給的字元分割成若干的整數並存入list。

實戰演練

將3 4 5所學到的知識運用在b964 第1題 成績指標

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
while 1:
try:
n=int(input())
score=list(map(int,input().split())) # 知識點5
score.sort() # 知識點3
for i in range(n):
print('%d'%score[i],end=' ')
print()

fail,success=-1,101
for i in range(n):
if score[i] > fail and score[i]<60:
fail = score[i]
if score[i] < success and score[i]>=60:
success = score[i]

if fail==-1:
print('best case')
else:
print(fail)
if success==101:
print('worst case')
else:
print(success)
except EOFError:
break

宣告二維陣列

用list宣告一個x*y的二維陣列:

[[0]*y for i in range(x)]

實戰演練

b965 第2題 矩陣轉換為例。

心得:有被這題陰到,吃了3次NA,
第一次是自己粗心,有一小部分判斷的條件寫錯。
第二次是送出去才知道題目是給B求出A,而不是給A求出B。(A為原始矩陣、B為運算後矩陣)
第三次是搞錯順序,畢竟題意是用B回推A,所以條件的部分應該是反著做才對,像是1 0 0的話,就對B做0->0->1。
第四次送出總算是AC了,唉,看來我閱讀題目還是不夠謹慎,這三次NA是可以避免的。

用B矩陣來表示矩陣現在是沒有旋轉的狀態(turned = False),用A矩陣來表示矩陣現在是被旋轉過的狀態(turned = True)。

AC (0.2s, 3.5MB)

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
while 1:
try:
r,c,m = map(int,input().split())
a = [ [0]*r for i in range(c) ] # C列R行
b = [ [0]*c for i in range(r) ] # R列C行

for i in range(r):
l = list(map(int,input().split()))
for j in range(c):
b[i][j] = l[j]

op = list(map(int,input().split()))
turned = False
for i in range(m-1, -1, -1):
if op[i] == 0:
if turned == False:
turned = True

for j in range(c):
for k in range(r):
a[j][k] = b[k][c-1-j]
else:
turned = False

for j in range(r):
for k in range(c):
b[j][k] = a[k][r-1-j]

elif op[i] == 1:
if turned == True:
for j in range(c//2):
for k in range(r):
t = a[j][k]
a[j][k] = a[c-1-j][k]
a[c-1-j][k] = t
else:
for j in range(r//2):
for k in range(c):
t = b[j][k]
b[j][k] = b[r-1-j][k]
b[r-1-j][k] = t

if turned == True:
print(c,r)
for i in range(c):
for j in range(r-1):
print(a[i][j],end=' ')
print(a[i][r-1])
else:
print(r,c)
for i in range(r):
for j in range(c-1):
print(b[i][j],end=' ')
print(b[i][c-1])
except EOFError:
break

用eval()做四則運算

如果想要做四則運算,不妨考慮eval(),只需將一個字串丟到裡面,就會自動計算成值,只是若字串裡有變數,需要先賦予變數一個值,再用eval()計算。

用replace()來改變字串裡的字元

假設有一字串s,今天若想要一次將字串裡所有的’a’變成’abc’,可以這樣寫:

s.replace(‘a’,’abc’)

實戰演練

將7 8所學到的知識運用在a017 五則運算
這題用C或是C++來解的話,會比Python麻煩很多,因為它們可沒有這樣的一個函式可以幫你將字元轉成數字和運算元,並進行運算得出結果。畢竟這篇是Python筆記,所以我就投機取巧一下吧。XD

1
2
3
4
5
6
7
8
import sys

while 1:
try:
s=input()
print(eval(s.replace("/","//"))) # 知識點7 8
except EOFError:
break

字典的搜尋

可以用get(key)來找看看字典裡是否有這個key,有的話會回傳這個key對應的value ,沒有則回傳None。

字典的排序

sorted(d.items(), key=lambda x:x[0])
如果是x:x[0],那sorted()就會照字典d的key的alphabetical order排序。
如果是x:x[1],那sorted()就會照字典d的value的alphabetical order排序。
若value全為整數,則預設由小排到大。

新增字典裡的元素

直接這樣打:dictName[key] = value,這樣就對該dictionary建好一個新的item。

實戰演練

結合9 10 11所學,用於a743: 10420 - List of Conquests
這題的話我們只需要每行的第一個單字,人名根本不重要。每次輸入完一行,就檢查該國家是否有出現過,沒有的話建一個新的。最後依照國家的alphabetical order輸出國家與人數。

1
2
3
4
5
6
7
8
9
10
11
12
13
n = int(input())
d = {}

for i in range(n):
s = input().split()
if d.get(s[0]) == None: # 知識點9
d[s[0]] = 1 # 知識點11
else:
d[s[0]] += 1

dd = sorted(d.items(), key=lambda x:x[0]) # 知識點10
for k,v in dd:
print(k,v)

封面圖源:Pixiv