0
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-09-19

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

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

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

入力

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

input

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

スペース区切りの複数入力の受け取り(受け取り変数を分ける)

split(区切り文字)

# hello worldを標準入力にて渡す
a, b = input().split(' ')
print(a) # helloと出力される
print(b) # worldと出力される

splitは文字列を指定区切り文字で区切ってリストとして返します

スペース区切りの複数入力の受け取り(リストで受け取る)

split(区切り文字)

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

数値として受け取る(一つ)

int(整数型に変換したい文字列)

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

数値として受け取る(リスト)

[int(x) for x in input().split(' ')]

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

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

文字列を文字のリストとして受け取る

list(文字列)

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

リストの準備

空のリスト

list()

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

初期値を一定数個もつリスト

[値 for _ in range(個数)]

a = [-1 for _ in range(5)]
print(a)# [-1,-1,-1,-1,-1]と出力される

繰り返しに使う変数を「_」としているのは、
繰り返し回数を特に使わないためです。
また、-1の部分はTrueやNoneなどでも問題ありません。
ただし、前述の通り、参照コピーになるようなのでオブジェクトを入れるときは注意が必要です。

初期値を一定数個もつリスト2

[値 for x in range(個数)]

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

初期値を一定数個もつリスト(簡易版)

[値]*個数

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

多次元配列

[...[[値]*個数]*個数...]

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

リスト操作

要素数の取得

len(リスト)

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

要素の追加

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

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

要素の削除

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

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

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

要素が存在するか確認

確認したい値 in リスト

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

リストの連結

リスト1+リスト2

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

要素値の合計

sum(リスト)

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

指定要素のカウント1

リスト.count(検索したい要素)

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

指定要素のカウント2(count_if 的なもの)

sum(1 for x in 対象リスト if 抽出条件)

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(繰り返し回数)

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

aからbまで(bを含まない)まで繰り返す

for i in range(a,b)

for i in range(1,5):
    print(i) # 1~4が出力

aからbまで(bを含まない)までcずつ増やして繰り返す

for i in range(a,b,c)

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

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

リストやタプルの中身を一つずつ最後まで取り出す

for v in リストなど:

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

添え字と中身を同時に最後まで取り出す

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

ソート

元のリストを変更してソート

a = [5,3,1,2,4]
a.sort()
print(a) # [5, 3, 1, 2, 4]

元のリストを変更せずにソートしたリストを得る

a = [5,3,1,2,4]
b = sorted(a)
print(a) # [5, 3, 1, 2, 4]
print(b) #[1, 2, 3, 4, 5]

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0