Introduction
ここでは,競技プログラミング(競プロ)で Python を使う際によく利用するテクニックを備忘のためメモに残しておく. バージョンは CPython 3.11.4 を想定している(2024 年 3 月時点). 以下,サンプルコードは部分的かつ厳密ではなく,自分で形式がわかれば OK としている(自分の備忘のためなので).
list
生成(内包表記)
a = [k ** 2 for k in range(1, 101) if k % 2 == 0]
イテレート
s = 0 for x in a: s += x
指定要素の個数
num = a.count("ABC")
list 末尾に要素追加
a.append(x)
list 末尾の要素削除
t = a.pop()
list の指定位置に要素挿入
a.insert(0, x)
指定要素の list 内での存在判定
bin = "ABC" in a
整数 list 内要素の総和
a = [1, 2, 3, 4, 5] s = sum(a) # 15
整数 list 内要素の最大値・最小値
a = [1, 2, 3, 4, 5] max_a = max(a) # 5 min_a = min(a) # 1
list 要素のソート(破壊的・非破壊的)
a.sort() b = sorted(a)
整数 list の要素順序の反転
a.reverse() a.sort(reverse=True)
dictionary (dict)
イテレート
d = {"A": 1, "B": 2, "C": 3} for k, v in d.items(): print(k, v)
指定 key と value の削除
d.pop("A")
指定要素の dict 内 key での存在判定
bin = "A" in d
set
要素追加
s.add(998244353)
要素削除
s.remove(998244353)
指定要素の set 内での存在判定
bin = 998244353 in s
deque
空の deque の生成
from collections import deque d = deque()
deque 先頭に要素追加
d.appendleft(998244353)
deque 末尾に要素追加
d.append(998244353)
deque 先頭の要素削除
t = d.popleft()
deque 末尾の要素削除
t = d.pop()
イテレート
d = deque([1, 2, 3, 4, 5]) for v in d: print(v)
Counter
Counter の生成
from collections import Counter a = [1, 1, 2, 3, 4, 4, 4, 5] c = Counter(a)
その他イテレート関連
enumerate
a = [1, 2, 3, 4, 5] idx = [(i, x) for i, x in enumerate(a)]
zip
x = [1, 2, 3, 4, 5] y = [6, 7, 8, 9, 10] z = list(zip(x, y))
range
a = list(range(1, 10))
map
a = [-2, -1, 0, 1, 2] b = list(map(abs, a)) c = list(map(lambda k: k ** 2, a))
数学関連
abs
a = abs(x)
sqrt
import math s = sqrt(x)
gcd / lcm
import math a, b, c = 6, 12, 18 print(math.gcd(a, b, c)) # 6 print(math.lcm(a, b, c)) # 36
exp
import math a = math.exp(2) b = math.e ** 2 print(a == b) # False # math.exp(2) のほうがより正確な値を取る
log / log2 / log10
import math a = math.log(10, 2) b = math.log2(10) c = math.log10(10) print(a == b) # False # math.log2(10) のほうがより正確な値を取る(log10(x), log(x, 10) も同様)
その他
進数変換 (2 / 8 / 16)
x = 255 print(bin(x)) print(oct(x)) print(hex(x)) # 0b11111111 # 0o377 # 0xff
print(int("10")) print(int("10", 2)) print(int("10", 8)) print(int("10", 16)) # 10 # 2 # 8 # 16
Unicode / 文字変換
print(ord("A")) print(ord("a")) # 65 # 97
print(chr(65)) print(chr(97)) # A # a
bisect / bisect_left / bisect_right
import bisect a = [2, 3, 5, 7, 9, 11, 13, 15, 17, 19] print(bisect.bisect(a, 13)) print(bisect.bisect_left(a, 13)) print(bisect.bisect_right(a, 13)) # 7 # 6 # 7
accumulate
from itertools import accumulate a = [2, 3, 5, 7, 9, 11, 13, 15, 17, 19] acc = list(accumulate(a)) print(*acc) # 2 5 10 17 26 37 50 65 82 101
随時更新.
Best regards, e271828.