この記事を書いたきっかけ
プログラミングの問題を解いていると、特定の操作でつまずくことがよくありました。この記事では、よくわかっていない操作だけを一覧にし、自分がどこでつまずいているのかを自覚するためにまとめました。
競技プログラミングサイト「AtCoder」の「Python入門 AtCoder Programming Guide for beginners (APG4bPython)」に取り組み、自分が不安な操作を集めました。何度もこの記事を見直して、「絶対にわかる!」という状態にしたいです。もし、すべての操作が自信を持てるようになったら、この記事を削除するかもしれません。
Pythonの記法は一通り覚えたけど、特定の問題でうまくいかないという方は、この方法を参考にしてみてください。
操作集
出力
複数の要素の間に特定の文字列を挿入したい
print("Hello, world!", 123, sep="\n")
# 出力結果
# Hello, world!
# 123
スペース区切りで出力したい
end= で「出力後に挿入する文字列」を指定する
print("Hello, world!", end=" ")
print(123)
# 実行結果
# Hello, world! 123
コメントしたい(2種類)
# 123
# 456
# と出力するプログラムです
print(123)
print(456)
"""
print は受け取った要素を出力する
最後に改行が自動で挿入される
"""
プログラムの書き方
改行したい
セミコロン(;)で改行する。複数の実行文を 1 行にまとめて記述することができる。
print("hello"); print(123)
# 実行結果
# hello
# 123
一つの実行文を複数の行に分けて記述したい
バックスラッシュ( \ )を用いて書く
res = 1 + 2 + 3 + 4 \
+ 5 + 6 + 7 + 8
print(res)
# 実行結果
# 36
計算式
商と余りを一度に取得したい
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 型になる。
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 型になります。
print(2 ** 3) # 8
print(2 ** -3) # 0.125
入力
空白区切りの入力を受け取って、別々の変数に格納したい
a, b, c = map(int, input().split())
print(a)
print(b)
print(c)
# 入力例
# 10 20 30
# 実行結果
# 10
# 20
# 30
for文・While文
ループを抜けたい (break)
# break がなければこのループは i == 4 まで繰り返す
for i in range(5):
if i == 3:
print("ぬける")
break # i == 3 の時点でループから抜ける
print(i)
print("終了")
# 実行結果
# 0
# 1
# 2
# ぬける
# 終了
後の処理をとばして次のループへ進みたい (continue)
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) と書くことになる
for i in range(5, -1, -1):
print(i)
# 実行結果
# 5
# 4
# 3
# 2
# 1
# 0
リスト
簡単にリストを作りたい
list(for文に入れられるもの) でリストを作ることができる
# リスト [0, 1, 2, 3, 4] を作る
a = list(range(5))
# 文字列からリストを作る
a = list("AtCoder")
# a = ["A", "t", "C", "o", "d", "e", "r"]
for 文でリストの要素を列挙する
a = [3, 1, 4, 1, 5]
# a の要素を順に x に代入し、繰り返し処理を行う
for x in a:
# 5 回実行される
print(x)
# 出力結果
# 3
# 1
# 4
# 1
# 5
入力からリストを作りたい
# 入力から 1 行読み取り、空白で区切って整数のリストを作る
a = list(map(int, input().split()))
print(a)
# 入力
# 886 551 37 424 531
# 出力
# [886, 551, 37, 424, 531]
リストを任意の方法で出力したい
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 番目の要素を取得しながら削除することができる
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 変数名[削除したいインデックス] のように使う
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 が出現する最初の位置を取得することができる
# 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関数で文字列をアルファベット順に並べ替えることもできる
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 の要素を逆順に並べ替えることができます。
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 が重ならずに何回出現するかを求めることができる
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 に置き換えた文字列を取得できる
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 を返す
print("ATCODER".isupper()) # True
print("atcoder".islower()) # True
print("".islower()) # False
数字かどうか判定したい
- 文字列 s に対し、s.isdigit() で s が空でなく、s の文字がすべて数字かどうか判定することができる
print("0123456789".isdigit()) # True
print("ABC123".isdigit()) # False
print("".isdigit()) # False
大文字・小文字に変換したい
- 文字列 s に対し、s.upper() で s の小文字をすべて大文字に変換した文字列を取得できる
- 文字列 s に対し、s.lower() で s の大文字をすべて小文字に変換した文字列を取得できる
print("AtCoder".upper()) # ATCODER
print("AtCoder".lower()) # atcoder
要素をつなげて出力したい
文字列.join()で文字列を結合した文字列を返す
# リストの要素をスペースで結合
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初心者の方はぜひ参考にしてみてください。