kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

イディオム

昨日ほかの人の回答を見たりしてよく使うパターンをいくつも発見したので
軽くここでまとめ

入力

1行をひとつの文字列として読み取る

>>> input()
aaa bbb ccc
'aaa bbb ccc'

1行でひとつの数字を読み取る
ふたつ数字があるとエラー

>>> int(input())
123
123
>>> int(input())
123 456
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '123 456'

1行にいくつかの文字列があるとき
split()で分割

>>> input().split()
aaa bbb ccc
['aaa', 'bbb', 'ccc']

1行にいくつかの数字があるとき
mapかリスト閉包を使う

>>> list(map(int, input().split()))
123 456 789
[123, 456, 789]
>>> [int(x) for x in input().split()]
123 456 789
[123, 456, 789]

1行に複数のパラメータが指定されているとき

>>> s1, s2, s3 = input().split()
aaa bbb ccc
>>> s1
'aaa'
>>> s2
'bbb'
>>> s3
'ccc'

要素の個数+指定した数だけの数、という行

>>> cnt, *nums = [int(x) for x in input().split()]
5 1 2 3 4 5
>>> cnt
5
>>> nums
[1, 2, 3, 4, 5]

複数行

>>> arr = [int(x) for x in sys.stdin]
1
2
3
4 #ここでCtrl+Dを押している
>>> arr
[1, 2, 3, 4]

出力

文字列の配列をスペース区切りで出力する
joinでもいいですがアンパック *arrを使ったほうが楽
配列の要素をひとつずつカンマで区切った形となって処理されます

>>> arr = ["aaa", "bbb", "ccc"]
>>> print(" ".join(arr))
aaa bbb ccc
>>> print(*arr)
aaa bbb ccc

数値の配列でも同様
ただしjoinは文字列型しか受け取らないのでリスト閉包なりmapなりで
文字列にしてやる必要があります
アンパック使うほうが楽ですね

>>> arr = [1, 2, 3, 4, 5]
>>> print(" ".join([str(x) for x in arr]))
1 2 3 4 5
>>> print(" ".join(map(str, arr)))
1 2 3 4 5
>>> print(*arr)
1 2 3 4 5

配列を複数行に出力
アンパック+セパレータ指定でいけます

>>> [print(x) for x in arr]
1
2
3
4
5
>>> print(*arr, sep="\n")
1
2
3
4
5

フィルタ

フィルタと組み合わせると1行でかなり書けますね

>>> list(filter(lambda x: x > 3, [2, 4, 6]))
[4, 6]
>>> [x for x in [2, 4, 6] if x > 3]
[4, 6]

配列の要素

配列の第3要素から第4要素 arr[2:4]
配列の先頭の2要素 arr[:2]
配列の最後の要素 arr[-1]
配列の最後の2要素 arr[-2:]
配列の複製 arr[:]

グローバル変数

グローバル変数を関数の中で使う
プログラミングコンテストの題材ぐらいだとついついグローバルにしてしまいます

v = 0

def some_func():
    global v
    print(v)