【自分用】Pythonで覚えておきたい操作集 - 競技プログラミング初心者向け

# この記事を書いたきっかけ
プログラミングの問題を解いていると、特定の操作でつまずくことがよくありました。この記事では、よくわかっていない操作だけを一覧にし、自分がどこでつまずいているのかを自覚するためにまとめました。

競技プログラミングサイト「AtCoder」の「Python入門 AtCoder Programming Guide for beginners (APG4bPython)」に取り組み、自分が不安な操作を集めました。何度もこの記事を見直して、「絶対にわかる！」という状態にしたいです。もし、すべての操作が自信を持てるようになったら、この記事を削除するかもしれません。

Pythonの記法は一通り覚えたけど、特定の問題でうまくいかないという方は、この方法を参考にしてみてください。

https://atcoder.jp/contests/APG4bPython

https://docs.python.org/ja/3/tutorial/index.html
# 操作集
## 出力
### 複数の要素の間に特定の文字列を挿入したい
```python
print("Hello, world!", 123, sep="\n")
# 出力結果
# Hello, world!
# 123
```
### スペース区切りで出力したい
end= で「出力後に挿入する文字列」を指定する
```python
print("Hello, world!", end=" ")
print(123)

#　実行結果
# Hello, world! 123
```
### コメントしたい（２種類）
```python
# 123
# 456
# と出力するプログラムです
print(123)
print(456)
 
"""
print は受け取った要素を出力する
最後に改行が自動で挿入される
"""
```
## プログラムの書き方
### 改行したい 
セミコロン(;)で改行する。複数の実行文を 1 行にまとめて記述することができる。
```python
print("hello"); print(123)

# 実行結果
# hello
# 123
```
### 一つの実行文を複数の行に分けて記述したい
バックスラッシュ( \ )を用いて書く
```python
res = 1 + 2 + 3 + 4 \
     + 5 + 6 + 7 + 8
print(res)
# 実行結果
# 36
```
## 計算式
### 商と余りを一度に取得したい  
```python
q, r = divmod(20, 7)
print(q)  # 2
print(r)  # 6
```

### 複合代入演算子を使いたい
|複合代入演算子|	コード例	|複合代入演算子を使わない書き方|
|:-:|:-:|:-|
|+=	|x += 3	|x = x + 3|
|-=	|x -= 3	|x = x - 3|
|*=	|x *= 3	|x = x * 3|
|//=	|x //= 3	|x = x // 3|
|/=	|x /= 3	|x = x / 3|
|**=	|x **= 3	|x = x ** 3|
|%=	|x %= 3	|x = x % 3|

### int型とfloat型同士の計算結果
片方が int 型、片方が float 型の場合の和・差・積は float 型になる。
```python
a = 3.5
b = 4
print(a + b)  # 7.5
print(a - b)  # -0.5
print(a * b)  # 14.0
```

### int 型同士のべき乗  
a と b がともに int 型のとき、 a ** b の型は、
b≥0 場合は int 型、 
b<0 の場合は float 型になります。
```python
print(2 ** 3)   # 8
print(2 ** -3)  # 0.125
```

## 入力 
### 空白区切りの入力を受け取って、別々の変数に格納したい
```python
a, b, c = map(int, input().split())
print(a)
print(b)
print(c)
# 入力例
# 10 20 30
# 実行結果
# 10
# 20
# 30
```
## for文・While文
### ループを抜けたい (break)
```python
# break がなければこのループは i == 4 まで繰り返す
for i in range(5):
    if i == 3:
        print("ぬける")
        break  # i == 3 の時点でループから抜ける
 
    print(i)
 
print("終了")

# 実行結果
# 0
# 1
# 2
# ぬける
# 終了
```

### 後の処理をとばして次のループへ進みたい (continue)
```python
for i in range(5):
    if i == 3:
        print("とばす")
        continue  # i == 3 のとき これより後の処理を飛ばす
 
    print(i)
 
print("終了")

# 実行結果
# 0
# 1
# 2
# とばす
# 4
# 終了
```

### 逆順にループしたい（降順）
一般的に、range(N) を逆順にするときは range(N - 1, -1, -1) と書くことになる
```python
for i in range(5, -1, -1): 
    print(i)

# 実行結果
# 5
# 4
# 3
# 2
# 1
# 0
```
## リスト
### 簡単にリストを作りたい 
list(for文に入れられるもの) でリストを作ることができる
```python
# リスト [0, 1, 2, 3, 4] を作る
a = list(range(5))

# 文字列からリストを作る
a = list("AtCoder")

# a = ["A", "t", "C", "o", "d", "e", "r"]
```
### for 文でリストの要素を列挙する
 
```python
a = [3, 1, 4, 1, 5]
 
# a の要素を順に x に代入し、繰り返し処理を行う
for x in a:
    # 5 回実行される
    print(x)

# 出力結果
# 3
# 1
# 4
# 1
# 5
```
### 入力からリストを作りたい
```python
# 入力から 1 行読み取り、空白で区切って整数のリストを作る
a = list(map(int, input().split()))
 
print(a)

# 入力
# 886 551 37 424 531
# 出力
# [886, 551, 37, 424, 531]
```
### リストを任意の方法で出力したい
```python
a = [9, 9, 7, 3]
 
# a の要素を空白区切りで出力する
print(*a)
 
# a の要素を改行区切りで出力する
for x in a:
    print(x)

# 出力
# 9 9 7 3
# 9
# 9
# 7
# 3
```
### リストの末尾に要素を追加・削除したい
- リスト a と値 x に対し、**a.append(x)** で a の末尾に要素 x を追加できる
- リスト a に対し、**a.pop()** で a の末尾の要素を取得しながら削除できる
- リスト a と整数 i と値 x に対し、**a.insert(i, x)** で a の i 番目の位置 (a[i-1] と a[i] 間) に x を挿入することができる
- リスト a と整数 i に対し、**a.pop(i)** で a の i 番目の要素を取得しながら削除することができる
###  
```python
a = []
a.append(1)  # a は [1] になる
a.append(2)  # a は [1, 2] になる
a.append(3)  # a は [1, 2, 3] になる

print(a.pop())  # 3 を出力し、a は [1, 2] になる
print(a.pop())  # 2 を出力し、a は [1] になる
print(a.pop())  # 1 を出力し、a は [] になる
```

### リストの要素を削除したい
- del 文は指定されたインデックスの要素を削除する
- del 変数名[削除したいインデックス] のように使う
```python
l = [0, 10, 20, 30, 40, 50]

del l[0]
print(l)
# [10, 20, 30, 40, 50]
```
### リストの中に x があるか調べたい 
- リスト a と値 x に対し、x **in** a で x が a の中に 1 個以上存在するかを判定することができる
    - not (x in a) は x not in a と書くこともできる
- リスト a と値 x に対し、**a.count(x)** で x が の中に何個存在するかを取得することができる
- リスト a と値 x に対し、**a.index(x)** で a の中に x が出現する最初の位置を取得することができる
```python
# x が 1, 2, 3 のいずれかであるかを判定する
x = 2
print(x in [1, 2, 3])

a = [3, 1, 4, 1, 5]
print(a.count(1))  # 1の数を数える
print(a.index(1))  # 最初の1の位置を調べる
```
### リストをソートしたい
- **a.sort()** で a の要素を昇順に並べ替えることができる
- sorted関数でa の要素を昇順に並べ替えることができる
    - sorted関数で文字列をアルファベット順に並べ替えることもできる
```python
a = [3, 1, 4, 1, 5]
a.sort()
print(a)  # [1, 1, 3, 4, 5]

a = [3, 1, 4, 1, 5]
new_a = sorted(a)
print("元のリスト:", a)  # [3, 1, 4, 1, 5]
print("新たなリスト:", new_a)  # [1, 1, 3, 4, 5]

l = ["diamond", "apple", "birth", "choco"]
print(sorted(l)) # ['apple', 'birth', 'choco', 'diamond']
```
### リストを反転したい
**a.reverse()** で a の要素を逆順に並べ替えることができます。
```python
a = [3, 1, 4, 1, 5]
# a を反転する。a は a = [5, 1, 4, 1, 3] になる。
a.reverse()
print(a)
```
## 文字列
### 部分文字列に x があるか調べたい 
- 文字列 s,t に対し、t **in** s で s の部分文字列に t が含まれるかどうか判定することができる
- 文字列 s,t に対し、**s.index(t)**　で s に現れる最初の部分文字列 t の位置を求めることができる
- 文字列 s,t に対し、**s.count(t)** で s に部分文字列 t が重ならずに何回出現するかを求めることができる

```python
s = "ABABABA"
print("BAB" in s)
print(s.index("BAB"))
print(s.count("BAB"))
print("AAAAAAAAAA".count("AAA"))

# 出力
# True
# 1
# 1
# 3
```

### 部分文字列を置換したい 
- 文字列 s,t,u に対し、**s.replace(t, u)** で s に重ならずに出現する部分文字列 t をすべて u に置き換えた文字列を取得できる
```python
print("1 + 2 + 3".replace("+", "**"))
print("AAAAA".replace("AA", "X"))

# 出力
# 1 ** 2 ** 3
# XXA
```

### 大文字・小文字かどうか判定したい
- 文字列 s に対し、**s.isupper()** で s の文字がすべて大文字かどうか判定することができる
    - より正確には、s.isupper() は s に大文字が含まれていて、小文字が含まれないとき True を返す
- 文字列 s に対し、**s.islower()** で s の文字がすべて小文字かどうか判定することができる
    - より正確には、s.islower() は s に小文字が含まれていて、大文字が含まれないとき True を返す
```python
print("ATCODER".isupper())  # True
print("atcoder".islower())  # True
print("".islower())  # False
```
### 数字かどうか判定したい
- 文字列 s に対し、**s.isdigit()** で s が空でなく、s の文字がすべて数字かどうか判定することができる

```python
print("0123456789".isdigit())  # True
print("ABC123".isdigit())  # False
print("".isdigit())  # False
```
### 大文字・小文字に変換したい
- 文字列 s に対し、**s.upper()** で s の小文字をすべて大文字に変換した文字列を取得できる
- 文字列 s に対し、**s.lower()** で s の大文字をすべて小文字に変換した文字列を取得できる
```python
print("AtCoder".upper())  # ATCODER
print("AtCoder".lower())  # atcoder
```

### 要素をつなげて出力したい 
文字列.join()で文字列を結合した文字列を返す

```python
# リストの要素をスペースで結合
words = ["Hello", "world"]
sentence = " ".join(words)
print(sentence)  # Hello world

# リストの要素をカンマで結合
fruits = ["apple", "banana", "cherry"]
fruit_string = ", ".join(fruits)
print(fruit_string)  # apple, banana, cherry

# リストの要素をそのまま結合
letters = ["A", "t", "C", "o", "d", "e", "r"]
word = "".join(letters)
print(word)  # AtCoder

# リストの要素を改行で結合
lines = ["Line 1", "Line 2", "Line 3"]
paragraph = "\n".join(lines)
print(paragraph)
# 出力:
# Line 1
# Line 2
# Line 3
```
# まとめ
よくわかっていない書き方が30個近くありましたが、これらをひとつずつ覚えて使いこなせるようになれば、解ける問題もひとつずつ増えていくはずです。根気強く取り組んでいきたいと思います。

この「覚えておきたい操作集」はあくまで私個人のものですが、Python初心者の方はぜひ参考にしてみてください。