Python3 備忘録自分用



### Python 大きい値を保存しておく
```
ans = max(ans,n)
```

---
### ソートについて
このような形の場合におけるソートを行う方法

```
ab 5
ab 4
ab 3
fds 4
fao 3
```

このような際に名前が辞書順でありかつ値が小さい方が先にくるというソートをしたい場合は

```
S = []
S.append((s, -n, i))
S.sort()
```

として、値をマイナスにすることによって求めているソートを行うことが出来るようになるそして、iがもともとのリストから何番目に来るのかということがわかる。


---

### 区切りをつけた数値の入力方法
例) N M C　（数値）

```
N,M,C =map(int, input().split())

```

### 数値の行列の入力方法

```
A = []
for i in range(N):
    array = list(map(int, input().strip().split()))
    A.append(array)

```

### 数値の桁数を調べる方法

```
print(len(str(A)))
```

### 回数がわからない場合の縦に数値が並んでいる場合
```
while True:
    x = int(input())
    if x == 0:
        break #whileから抜ける
```

### 文字を行列のように表示する方法
ex) 
★★★★★
★★★★★
★★★★★
★★★★★

```
    for i in range(0,a):
        for j in range(0,b):
            print("#", end="")
        print()#改行をしてくれる
``` 

### 改行
```
print()#これだけでOK
```

### リストの逆順にする方法

[::-1]をつけることでリストを逆順で表示できる#[::-1]をつけることでリストを逆順で表示できる

```
for i in range(0,n):
    print(a[::-1][i] ,end=" ")
```

### 数字の文字列からなるリストのソート方法
```
l = ['10', '1', '5']

print(sorted(l, key=int))
# ['1', '5', '10']
```
単なる.sort()ではなくsorted(l,key=int)を用いることによってソートすることが出来る。

### n*mの行列の入力および計算方法

```
#入力例
3 4
1 2 0 1
0 3 0 1
4 1 1 0
1
2
3
0

```
n*mの行列及び、m*1の行列計算を行うことが出来る↓


```
n,m = map(int, input().split())
l = [0]*n
for i in range(0,n):
    l[i] = list(map(int, input().split()))#n*mの行列の入力
c = [int(input()) for i in range(m)]#m*1の行列入力

sum = [0]*n

for i in range(0,n):
    for j in range(0,m):
       sum[i] = sum[i] + l[i][j]*c[j]
```


### 文字列の比較
入力が同じ形式であれば、以下のような文字列同士の比較を行うことも出来る

```
if(S <= "2019/04/30"):
    print("Heisei")
else:
    print("TBD")
```

###　リストを空白区切りだけで出力する。
```
L = [10,20,30,40]
print(' '.join(map(str, L)))
#出力例
10 20 30 40
```

### 文字列と数値が同じ列で入力に来た場合

```
2
10000 JPY
0.10000000 BTC
```
このような場合の対処方法

```
N =int(input())
sum = 0
for i in range(0,N):
  N,M =map(str, input().split())
```
ここでは一度変数に入れて毎回更新を行う方法をとっているこの問題の場合は必要なものが合計値であったためこのような方式をとった。


### リストにおけるfor文の使い方

```
for ans in answers:
  for a in ans[1:]:
    foods[a-1] += 1
```
これによってfoodsの配列の値の増加が出来る。
上の例だとanswersの配列をひとつづつ

```
answers = [[2, 1, 3], [3, 1, 2, 3], [2, 3, 2]]
```
ansの中にanswersの中のリストがひとつづつansの中に入るようになっている。その中からans[1:]添え字1から最後までのfor文でまわしている。
ansの中の値がaになっている。

###　アルファベットの列挙
アルファベットの列挙したリストの表示

```
al=[chr(ord('a') + i) for i in range(26)]
print(al)
## ord: アスキーコードを取得
## chr: アスキーコードから文字へ
```

### 素因数分解
素因数分解を行うコードpfにリストとして、素因数が保存される。

```
pf={}
m=341555136
for i in range(2,int(m**0.5)+1):
    while m%i==0:
        pf[i]=pf.get(i,0)+1
        m//=i
if m>1:pf[m]=1
print(pf)
```

### 複数文字列の変換を行う方法

```
S='54IZSB'
S = S.translate(str.maketrans("ODIZSB","001258"))
print(S)
Ex output) 541258 (この場合三文字目以降のIZSBが1258に入れ替わっている。
#第一引数の部分的に同じところを第二引数に変換を行うことが出来る。
```

### 累積和の実装方法について
```
A = [3, 8, 2, 9, 3, 9, 10, 6]
N = len(A)

S = [0]
for i in range(0, N):
 S.append(S[i] + A[i])
#Sが累積和となっているためそれを利用することによって区間における計算を行うことが出来る。
# 配列A の区間 1 ~ 3 の総和は
S_1_3 = S[3] - S[1]
print(S_1_3)

```

##Pythonのプログラムにおいて途中で終了する方法
C言語における早期リターンのような機能を探していた。
そのための方法としてexit()が存在している。

```
exit()
```
## 文字列を一つづつリストの要素にする方法

```
2 3
..#
#..
```
こういう入力が来て、

```
[['.', '.', '#'], ['#', '.', '.']]
```
このように区切られていない文字列をリストの一つの要素として入力する方法

```
for i in range(N):
    %この時点で文字列として入力を受けて
    str = input()
    % 以下において文字列自体をリスト化する "..#" を['.', '.', '#']に変えてしまう。
    array = list(str)
    % 最後に全体のリストの中にリスト事入れることで一文字ずつリストの要素としたリストになる。
    l.append(array)
```