e-Log

e271828のブログだお

競プロでよく使うテク with Python

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.