競技プログラミング時に便利なスニペット（python3版）

はじめまして、とあるIT会社の２年目社員です。
入社して一年半が過ぎ、仕事にも慣れてきたため自己学習に時間と体力を割く余裕が出てきており、
最近[Paiza](https://paiza.jp/challenges)にてアルゴリズムの勉強を行っています。
そこで思ったのですが、どうやら競技プログラミングの問題には

* アイディアレベルで処理の流れを考える力
* 上記を実際にプログラムに落とし込む力


の二つが必要なようです。
特に競技中に後者の部分で詰まって時間がかかってしまうのはもったいないと思われます。
そこで今回は、競技プログラミング時に便利なコードをまとめてみました。
言語についてはpython3を対象としています。

#入力
###一行の入力全体を文字列として受け取る
input

```python
# helloを標準入力にて渡す
a = input()
print(a) # helloと出力される
```

### スペース区切りの複数入力の受け取り（受け取り変数を分ける）
split(区切り文字)

```python
# hello worldを標準入力にて渡す
a, b = input().split(' ')
print(a) # helloと出力される
print(b) # worldと出力される
```
splitは文字列を指定区切り文字で区切ってリストとして返します

### スペース区切りの複数入力の受け取り（リストで受け取る）
split(区切り文字)

```python
# this is a penを標準入力にて渡す
a = input().split(' ')
print(a) # [this, is, a, pen]と出力される
```


### 数値として受け取る（一つ）
int(整数型に変換したい文字列)

```python
# 100を標準入力にて渡す
a = int(input())
print(a) # 100と出力される
```


### 数値として受け取る（リスト）
[int(x) for x in input().split(' ')]

```python
# 100 200 300を標準入力にて渡す
a = [int(x) for x in input().split(' ')]
print(a) # [100,200,300]と出力される
```

これは若干読みにくいのですが、
[**リストに入れたい値** for **繰り返し用変数** **繰り返し条件**]
という形になっています。
入力をsplitで切り分けてリストにし、拡張forで全要素を取り出し、
それぞれに対してint(x)をしてどんどんリストに追加していくようです。
また、**リストに入れたい値**がオブジェクトの場合、参照コピーになるようです。
つまり、一つ変更すると全部の値が変わります。


### 文字列を文字のリストとして受け取る
list(文字列)

```python
# hello
a = list(input())
print(a) # ['h','e','l','l','o']と出力される
```

#リストの準備
###空のリスト
list()

```python
a = list()
print(a) # []と出力される
```

###初期値を一定数個もつリスト
[値 for _ in range(個数)]

```python
a = [-1 for _ in range(5)]
print(a)# [-1,-1,-1,-1,-1]と出力される
```
繰り返しに使う変数を「_」としているのは、
繰り返し回数を特に使わないためです。
また、-1の部分はTrueやNoneなどでも問題ありません。
ただし、前述の通り、参照コピーになるようなのでオブジェクトを入れるときは注意が必要です。

###初期値を一定数個もつリスト2
[値 for x in range(個数)]

```python
a = [x*2 for x in range(3)]
print(a)# [0,2,4]と出力される
```


###初期値を一定数個もつリスト（簡易版）
[値]*個数

```python
a = [0] * 3
print(a)# [0,0,0]と出力される
```


###多次元配列
[...[[値]\*個数]\*個数...]

```python
a = [[0]*2]*3
print(a)# [[0, 0], [0, 0], [0, 0]]と出力される
```

#リスト操作
### 要素数の取得
len(リスト)

```python
a = [1,2,3,4,5]
print(len(a)) # 5と出力される
```

### 要素の追加
リスト.append(追加したい要素)

```python
a = [1,2,3,4,5]
a.append(6)
print(a) # [1,2,3,4,5,6]
```

### 要素の削除
リスト.remove(削除したい要素)

```python
a = [1,2,3,4,2,5]
a.remove(2)
print(a) # [1,3,4,2,5]と出力される
```

ヒットした中で一番最初の要素のみを削除する

### 要素が存在するか確認
確認したい値 in リスト

```python
a = ['apple','blueberry','citrus']
print('blueberry' in a) # Trueと出力される
print('dragon fruit' in a) # Falseと出力される
```

### リストの連結
リスト１+リスト２

```python
a = [1,2,3]
b = [4,5,6]
c = a + b
print(c) # [1,2,3,4,5,6]
```

### 要素値の合計
sum(リスト)

```python
a = [1,2,3]
print(sum(a)) # 6と出力される
```

### 指定要素のカウント1
リスト.count(検索したい要素)

```python
a = ['ト', 'ト', 'ト','ツー', 'ツー', 'ツー', 'ト', 'ト', 'ト']
print(a.count('ト')) # 6と出力される
```


### 指定要素のカウント2（count_if 的なもの）
sum(1 for x in 対象リスト if 抽出条件) 

```python:10～19までの値がいくつあるか数える例
a = [1, 5, 9, 10, 12, 19, 20, 25, 30]
print(sum(1 for x in a if 10 <= x and x <= 19)) # 3と出力される
```
「1 for x in 対象リスト if 抽出条件」の書き方はジェネレータというそうです。
まだよく理解できていませんが、どうやら繰り返しに特化したリストに近いものを出力してくれるようです。
これにより、条件に合う時だけ、リストもどきに1という要素が追加され、
最後のsumでその値を合計することで条件に合う要素の個数がわかります。

#繰り返し
### 指定回数繰り返す（基本型）
for i in range(繰り返し回数)

```python
for i in range(5):
    print(i) # 0~4が出力
```

### aからbまで（bを含まない）まで繰り返す
for i in range(a,b)

```python
for i in range(1,5):
    print(i) # 1~4が出力
```
### aからbまで（bを含まない）までcずつ増やして繰り返す
for i in range(a,b,c)

```python
for i in range(1,10,2):
    print(i)

#出力は以下
#1
#3
#5
#7
#9
```

### リストやタプルの中身を一つずつ最後まで取り出す
for v in リストなど:

```python
a = [1,2,3,4,5]
for v in a:
    print(v) # 1~5が出力
```

### 添え字と中身を同時に最後まで取り出す
```python
a = [1,2,3,4,5]
for i,v in enumerate(a):
    print('[{}] = {}'.format(i,v))
 
#出力は以下   
#[0] = 1
#[1] = 2
#[2] = 3
#[3] = 4
#[4] = 5
```

#ソート
### 元のリストを変更してソート
```python
a = [5,3,1,2,4]
a.sort()
print(a) # [5, 3, 1, 2, 4]
```

### 元のリストを変更せずにソートしたリストを得る
```python
a = [5,3,1,2,4]
b = sorted(a)
print(a) # [5, 3, 1, 2, 4]
print(b) #[1, 2, 3, 4, 5]
```




以上です。
お読みいただきありがとうございました。