907
Help us understand the problem. What are the problem?

posted at

updated at

AtCoderの問題を分類しました

はじめに

AtCoder の問題を Python で解いており、得られた知見をメモとして残しています。

本記事について

本記事について説明します。

構成

本記事では 分類観点 を定義し、分類観点ごとに問題を分類しています。各分類観点では、サンプルコード入力 / 実行結果)と 解答例 を記載しています。サンプルコード(入力 / 実行結果)と 解答例 は下記の通りです。

項目 項目内容
サンプルコード 問題から得られた知見と検証によって得られた知見を整理したコード
入力 サンプルコードの入力例
実行結果 サンプルコードの実行結果
解答例 AtCoder で AC になったコード
解答例(TLE) AtCoder で TLE になったコード

分類観点の定義

分類観点の定義は下記の通りです。1つの問題から複数の観点で分類できる問題は、複数の観点に分類します。

観点 観点内容
第1章 入出力処理観点 入出力処理を知っていれば解ける問題
第2章 演算観点 演算を知っていれば解ける問題
第3章 制御構文観点 制御構文を知っていれば解ける問題
第4章 組み込み型観点 組み込み型を知っていれば解ける問題
第5章 組み込み関数観点 組み込み関数を知っていれば解ける問題
第6章 モジュール観点 モジュールを知っていれば解ける問題
第7章 データ構造観点 データ構造を知っていれば解ける問題
第8章 アルゴリズム観点 アルゴリズムを知っていれば解ける問題
第9章 計算量観点 計算量を工夫すれば解ける問題
第10章 数学観点 数学的知見を知っていれば解ける問題
第11章 カテゴリ観点 カテゴリ特有の解き方を知っていれば解ける問題
- 参考 -

分類する問題の範囲

分類する問題の範囲は下記の通りです。ABC-C問題 と ARC-A問題 は一部の問題が同じです。同じ問題の場合、ABC-C問題 として分類します。

  • ABC-A問題(ABC001 - ABC253)
  • ABC-B問題(ABC001 - ABC253)
  • ABC-C問題(ABC001 - ABC253)
  • ARC-A問題(ARC001 - ARC137)
  • AtCoder Problems における Difficulty 0 - 800 の問題

分類する対象の問題

本記事では、上記分類範囲で示したすべての問題が記載されているわけではありません。私が上記分類観点で知見が得られた問題のみを記載しています。

バージョン / 言語

サンプルコードは Python の下記バージョンで動作することを確認しました。

Python 3.8.2

解答例は AtCoder の下記言語で AC になることを確認しました。

Python (3.8.2)

コーディングスタイル

本記事のサンプルコードは pycodestyle の下記バージョンでコーディングスタイルを確認しました。

pycodestyle 2.8.0

コードリポジトリ

本記事のコードは下記のリポジトリで公開しています。

最後に

サービスを提供している AtCoder株式会社 と、交流している 競技プログラマ の方々に感謝を致します。

第1章 入出力処理観点

1.1 出力

  • print():objects を sep で区切りながらテキストストリーム file に表示し、最後に end を表示する
  • 入力と出力

整数(int)

整数を出力する

サンプルコード
print(10)
実行結果
10

整数を変数に格納して出力する

サンプルコード
x = 20
print(x)
実行結果
20

浮動小数点数(float)

浮動小数点数を出力する

サンプルコード
print(2.9)
実行結果
2.9

浮動小数を変数に格納して出力する

サンプルコード
x = 3.5
print(x)
実行結果
3.5

文字列(str)

文字列を出力する

サンプルコード
print("Hello World!")
実行結果
Hello World!

文字列を変数に格納して出力する

サンプルコード
x = "Hello World!"
print(x)
実行結果
Hello World!

文字列の変数のインデックスを指定して文字を出力する

サンプルコード
x = "Hello World!"
print(x[0])
print(x[11])
実行結果
H
!

リスト(list)

1次元リストを出力する

サンプルコード
x = [1, 2, 3, 4, 5]
print(x)
実行結果
[1, 2, 3, 4, 5]

1次元リストの各要素を出力する

サンプルコード
x = [1, 2, 3, 4, 5]
for i in x:
    print(i)
実行結果
1
2
3
4
5

1次元リストのインデックス指定して各要素を出力する

サンプルコード
x = [1, 2, 3, 4, 5]
for i in range(len(x)):
    print(x[i])
実行結果
1
2
3
4
5

1次元リストをアンパックで出力する

サンプルコード
x = [1, 2, 3, 4, 5]
print(*x)
実行結果
1 2 3 4 5

2次元リストを出力する

サンプルコード
x = [[1, 2, 3], [4, 5, 6]]
print(x)
実行結果
[[1, 2, 3], [4, 5, 6]]

2次元リストの各行を出力する

サンプルコード
x = [[1, 2, 3], [4, 5, 6]]
for rows in x:
    print(rows)
実行結果
[1, 2, 3]
[4, 5, 6]

2次元リストの各要素を出力する

サンプルコード
x = [[1, 2, 3], [4, 5, 6]]
for rows in x:
    for columns in rows:
        print(columns)
実行結果
1
2
3
4
5
6

2次元リストの各要素をインデックス指定して出力する

サンプルコード
x = [[1, 2, 3], [4, 5, 6]]
for i in range(len(x)):
    for j in range(len(x[i])):
        print(x[i][j])
実行結果
1
2
3
4
5
6

2次元リストの各行をアンパックで出力する

サンプルコード
x = [[1, 2, 3], [4, 5, 6]]
print(*x)
実行結果
[1, 2, 3] [4, 5, 6]

タプル(tuple)

サンプルコード
x = 1, 2, 3
print(x)
実行結果
(1, 2, 3)

区切り文字の指定

  • print():キーワード引数 sep を指定する

指定がないと 半角スペース で区切る

サンプルコード
x = 1
y = 2
z = 3
print(x, y, z)
実行結果
1 2 3

改行 を指定する

サンプルコード
x = 1
y = 2
z = 3
print(x, y, z, sep="\n")
実行結果
1
2
3

カンマ を指定する

サンプルコード
x = 1
y = 2
z = 3
print(x, y, z, sep=",")
実行結果
1,2,3

区切り文字なし を指定する

サンプルコード
x = 1
y = 2
z = 3
print(x, y, z, sep="")
実行結果
123

末尾文字の指定

  • print():キーワード引数 end を指定する

指定がないと 改行する

サンプルコード
print("x")
print("y")
実行結果
x
y

末尾文字なし を指定する

サンプルコード
print("x", end="")
print("y")
実行結果
xy

1.2 入力

  • input():入力から1行を読み込み、文字列に変換して(末尾の改行を除いて)返す
  • map():function の結果を返しながら、全ての要素に適用する iterator を返す
  • str.split():文字列を区切った単語のリストで返す
  • リスト内包表記

1行 / 1列

整数を変数に格納する

入力
2
サンプルコード
x = int(input())
print(x)
実行結果
2

文字列を1つの変数に格納する

入力
Hello world!
サンプルコード
x = input()
print(x)
実行結果
Hello world!

文字列を複数の変数に格納する

入力
123
サンプルコード
x, y, z = input()
print(x, y, z)
実行結果
1 2 3
入力
abc
サンプルコード
x, y, z = input()
print(x, y, z)
実行結果
a b c

アンパックを使って変数に格納する

入力
abcde
サンプルコード
x, *y = input()
print(y)
実行結果
['b', 'c', 'd', 'e']
入力
abcde
サンプルコード
*x, y = input()
print(x)
実行結果
['a', 'b', 'c', 'd']
入力
abcde
サンプルコード
x, *y, z = input()
print(y)
実行結果
['b', 'c', 'd']
入力
abcde
サンプルコード
*x, y, z = input()
print(x)
実行結果
['a', 'b', 'c']
入力
abcde
サンプルコード
x, y, *z = input()
print(z)
実行結果
['c', 'd', 'e']

1行 / 複数列

整数を複数の変数に格納する

入力
1 2
サンプルコード
x, y = map(int, input().split())
print(x)
print(y)
実行結果
1
2

文字列を複数の変数に格納する

入力
Hello world!
サンプルコード
x, y = input().split()
print(x)
print(y)
実行結果
Hello
world!

整数をリストに格納する

入力
1 2 3 4 5
サンプルコード
x = list(map(int, input().split()))
print(x)
実行結果
[1, 2, 3, 4, 5]
入力
1 2 3 4 5
サンプルコード
x = [int(i) for i in input().split()]
print(x)
実行結果
[1, 2, 3, 4, 5]

文字列をリストに格納する

入力
Hello world !
サンプルコード
x = list(input().split())
print(x)
実行結果
['Hello', 'world', '!']
入力
Hello world !
サンプルコード
x = [i for i in input().split()]
print(x)
実行結果
['Hello', 'world', '!']

アンパックを使って変数に格納する

入力
a b c d e
サンプルコード
x, *y = input().split()
print(y)
実行結果
['b', 'c', 'd', 'e']
入力
a b c d e
サンプルコード
*x, y = input().split()
print(x)
実行結果
['a', 'b', 'c', 'd']
入力
a b c d e
サンプルコード
x, *y, z = input().split()
print(y)
実行結果
['b', 'c', 'd']
入力
a b c d e
サンプルコード
*x, y, z = input().split()
print(x)
実行結果
['a', 'b', 'c']
入力
a b c d e
サンプルコード
x, y, *z = input().split()
print(z)
実行結果
['c', 'd', 'e']
入力
1 2 3 4 5
サンプルコード
*x, = map(int, input().split())
print(x)
実行結果
[1, 2, 3, 4, 5]

複数行 / 1列

整数を複数の変数に格納する

入力
1
2
サンプルコード
x = int(input())
y = int(input())
print(x, y)
実行結果
1 2
入力
1
2
サンプルコード
x, y = [int(input()) for i in range(2)]
print(x, y)
実行結果
1 2

整数をリストに格納する

入力
1
2
3
4
5
サンプルコード
x = [int(input()) for i in range(5)]
print(x)
実行結果
[1, 2, 3, 4, 5]

文字列をリストに格納する

入力
a
b
c
d
e
サンプルコード
x = [input() for i in range(5)]
print(x)
実行結果
['a', 'b', 'c', 'd', 'e']

入力行数(Row=5)が指定され、整数をリストに格納する

入力
5
0
1
2
3
4
サンプルコード
rows = int(input())
x = [int(input()) for i in range(rows)]
print(x)
実行結果
[0, 1, 2, 3, 4]

入力行数(Row=5)が指定され、文字列をリストに格納する

入力
5
a
b
c
d
e
サンプルコード
rows = int(input())
x = [input() for i in range(rows)]
print(x)
実行結果
['a', 'b', 'c', 'd', 'e']

複数行 / 複数列

整数を2次元リストに格納する(入力時に行数が指定されない)

入力
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
サンプルコード
x = [list(map(int, input().split())) for i in range(3)]
print(x)
実行結果
[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]]

複数のリストに格納する(入力時に行数(rows)を指定する)

入力
3
0 a
1 b
2 c
サンプルコード
rows = int(input())
number = []
alphabet = []
for i in range(rows):
    n, a = input().split()
    number.append(int(n))
    alphabet.append(a)
print(number)
print(alphabet)
実行結果
[0, 1, 2]
['a', 'b', 'c']

整数を2次元リストに格納する(入力時に行数(rows)を指定する)

入力
3
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
サンプルコード
rows = int(input())
x = [list(map(int, input().split())) for i in range(rows)]
print(x)
実行結果
[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]]
入力
3
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
サンプルコード
rows = int(input())
x = [[int(j) for j in input().split()] for i in range(rows)]
print(x)
実行結果
[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]]
入力
3
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
サンプルコード
rows = int(input())
x = []
for i in range(rows):
    x.append(list(map(int, input().split())))
print(x)
実行結果
[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]]

整数を1次元リストに格納する

入力
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
サンプルコード
x = []
for i in range(3):
    x += list(map(int, input().split()))
print(x)
実行結果
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

それぞれの変数に格納する

入力
1 2
3 4
サンプルコード
a, b = map(int, input().split())
c, d = map(int, input().split())
print(a, b, c, d)
実行結果
1 2 3 4
入力
w x
y z
サンプルコード
a, b = input().split()
c, d = input().split()
print(a, b, c, d)
実行結果
w x y z

区切り文字の指定

入力
a,b,c,d
サンプルコード
x = list(input().split(","))
print(*x)
実行結果
a b c d
入力
2019/02/26
サンプルコード
y, m, d = map(int, input().split("/"))
print(y, m, d)
実行結果
2019 2 26

第2章 演算観点

2.1 算術演算

演算子 記述例 意味
+ a + b 加算
- a - b 減算
* a * b 乗算
** a ** b べき乗 / べき根
/ a / b 除算
// a // b 小数点切り捨て除算
% a % b 剰余

加算

サンプルコード
print(1+2)
実行結果
3
サンプルコード
x = 2+3
print(x)
実行結果
5
サンプルコード
x = 3
y = 4
print(x+y)
実行結果
7

減算

サンプルコード
print(2-1)
実行結果
1
サンプルコード
x = 4-2
print(x)
実行結果
2
サンプルコード
x = 3
y = 6
print(x-y)
実行結果
-3

乗算

サンプルコード
print(3*2)
実行結果
6
サンプルコード
x = 4*3
print(x)
実行結果
12
サンプルコード
x = 5
y = 6
print(x*y)
実行結果
30

階乗

サンプルコード
import math
print(math.factorial(5))
実行結果
120

べき乗

サンプルコード
print(2**3)
実行結果
8
サンプルコード
print(10**9+7)
実行結果
1000000007
サンプルコード
x = 3**2
print(x)
実行結果
9
サンプルコード
x = 4
y = 2
print(x**y)
実行結果
16

べき根

サンプルコード
print(9**0.5)
実行結果
3.0
サンプルコード
print(9**.5)
実行結果
3.0
サンプルコード
print(9**(1/2))
実行結果
3.0
サンプルコード
print(8**(1/3))
実行結果
2.0
サンプルコード
x = 16**.5
print(x)
実行結果
4.0
サンプルコード
x = 16
y = .5
print(x**y)
実行結果
4.0

除算

サンプルコード
print(6/3)
実行結果
2.0
サンプルコード
print(7/3)
実行結果
2.3333333333333335
サンプルコード
x = 9/3
print(x)
実行結果
3.0
サンプルコード
x = 12
y = 3
print(x/y)
実行結果
4.0

小数点切り捨て除算

サンプルコード
print(5//3)
実行結果
1
サンプルコード
print(6//3)
実行結果
2
サンプルコード
print(7//3)
実行結果
2
サンプルコード
print(-5//3)
実行結果
-2
サンプルコード
print(-6//3)
実行結果
-2
サンプルコード
print(-7//3)
実行結果
-3
サンプルコード
import math
print(math.floor(-5/3))
実行結果
-2
サンプルコード
import math
print(math.floor(-6/3))
実行結果
-2
サンプルコード
import math
print(math.floor(-7/3))
実行結果
-3

小数点切り上げ除算

  • math.ceil():引数以上の最小の整数を返す
サンプルコード
import math
print(math.ceil(1.1))
実行結果
2
サンプルコード
import math
print(math.ceil(7/3))
実行結果
3
サンプルコード
x = 7
y = 3
print((x+y-1)//y)
実行結果
3

剰余

サンプルコード
print(6 % 3)
実行結果
0
サンプルコード
print(7 % 3)
実行結果
1
サンプルコード
print(8 % 3)
実行結果
2
サンプルコード
print(-6 % 3)
実行結果
0
サンプルコード
print(-7 % 3)
実行結果
2
サンプルコード
print(-8 % 3)
実行結果
1

10*n+7

2.2 代入文

サンプルコード
x, y = 1, 2
print(x, y)
x, y = y, x
print(x, y)
実行結果
1 2
2 1

2.3 累算代入文

演算子 記述例 等式
+= a += b a = a + b
-= a -= b a = a - b
*= a *= b a = a * b
**= a **= b a = a ** b
/= a /= b a = a / b
//= a //= b a = a // b
%= a %= b a = a % b

2.4 論理演算

演算子 記述例 意味
and a and b a も b も真であれば真
or a or b a または b が真であれば真
not not a a が偽であれば真
サンプルコード
print(True and True)
実行結果
True
サンプルコード
print(True and False)
実行結果
False
サンプルコード
print(False and False)
実行結果
False
サンプルコード
print(True or True)
実行結果
True
サンプルコード
print(True or False)
実行結果
True
サンプルコード
print(False or False)
実行結果
False
サンプルコード
print(not True)
実行結果
False
サンプルコード
print(not False)
実行結果
True

2.5 比較演算

演算子 記述例 意味
== a == b a が b と等しい
!= a != b a が b と等しくない
> a > b a が b より大きい
>= a >= b a が b 以上
< a < b a が b より小さい
<= a <= b a が b 以下
サンプルコード
print(10 == 10)
実行結果
True
サンプルコード
print(10 == 20)
実行結果
False
サンプルコード
print(10 != 20)
実行結果
True
サンプルコード
print(10 != 10)
実行結果
False
サンプルコード
print(20 > 10)
実行結果
True
サンプルコード
print(10 > 20)
実行結果
False
サンプルコード
print(10 >= 10)
実行結果
True
サンプルコード
print(10 >= 11)
実行結果
False
サンプルコード
print(10 < 20)
実行結果
True
サンプルコード
print(20 < 10)
実行結果
False
サンプルコード
print(10 <= 10)
実行結果
True
サンプルコード
print(10 <= 9)
実行結果
False

2.6 所属検査演算

演算子 記述例 意味
in a in b a が b に含まれる
not in a not in b a が b に含まれない
サンプルコード
print("a" in "abc")
実行結果
True
サンプルコード
print("z" not in "abc")
実行結果
True
サンプルコード
print("a" in ["a", "b", "c"])
実行結果
True
サンプルコード
print("z" not in ["a", "b", "c"])
実行結果
True
サンプルコード
print(1 in [1, 2, 3])
実行結果
True
サンプルコード
print(9 not in [1, 2, 3])
実行結果
True

2.7 ブール演算

bool関数でFalseになる条件

種類 演算子
数値 0 または 0.0
文字列 空文字列
コンテナ 空要素
論理値 False
特殊 None
演算式 not True

ブール値を数値に変換

サンプルコード
print(int(True))
実行結果
1
サンプルコード
print(int(False))
実行結果
0
サンプルコード
print(+(3 > 2))
実行結果
1
サンプルコード
print(+(3 < 2))
実行結果
0
サンプルコード
print(-(3 > 2))
実行結果
-1
サンプルコード
print(-(3 < 2))
実行結果
0
サンプルコード
print(True+0)
実行結果
1
サンプルコード
print(False+0)
実行結果
0

2.8 ビット演算

演算子 記述例 意味
& a & b a と b のビット単位の AND を与える
^ a ^ b a と b のビット単位の XOR(排他的OR)を与える
| a | b a と b のビット単位の OR を与える
~ ~a a(整数)のビット単位反転を与える
演算 結果
bin(0b1010 & 0b0110) 0b10
bin(0b1010 ^ 0b0110) 0b1100
bin(0b1010 | 0b0110) 0b1110
サンプルコード
print(bin(0b1010 & 0b0110))
print(bin(0b1010 ^ 0b0110))
print(bin(0b1010 | 0b0110))
実行結果
0b10
0b1100
0b1110

ビット単位反転(bitwise invert):aのビット単位反転は-(a+1)として定義されている

サンプルコード
print(~2)
実行結果
-3
サンプルコード
print(~-4)
実行結果
3

2.9 シフト演算

演算子 記述例 意味
<< a << b a を左に b ビットシフト
>> a >> b a を右に b ビットシフト

左にビットシフト

演算 結果 10進数
bin(1) 0b1 1
bin(1 << 1) 0b10 2
bin(1 << 2) 0b100 4
bin(1 << 3) 0b1000 8
bin(1 << 4) 0b10000 16
サンプルコード
print(1)
print(1 << 1)
print(1 << 2)
print(1 << 3)
print(1 << 4)
print(bin(1))
print(bin(1 << 1))
print(bin(1 << 2))
print(bin(1 << 3))
print(bin(1 << 4))
実行結果
1
2
4
8
16
0b1
0b10
0b100
0b1000
0b10000

右にビットシフト

演算 結果 10進数
bin(10) 0b1010 10
bin(10 >> 1) 0b101 5
bin(10 >> 2) 0b10 2
bin(10 >> 3) 0b1 1
bin(10 >> 4) 0b0 0
サンプルコード
print(10)
print(10 >> 1)
print(10 >> 2)
print(10 >> 3)
print(10 >> 4)
print(bin(10))
print(bin(10 >> 1))
print(bin(10 >> 2))
print(bin(10 >> 3))
print(bin(10 >> 4))
実行結果
10
5
2
1
0
0b1010
0b101
0b10
0b1
0b0

第3章 制御構文観点

3.1 条件式

if/elif/else

サンプルコード
x = 1
print("x is 1" if x == 1 else "x is 2" if x == 2 else "other")
実行結果
x is 1
サンプルコード
x = "a"
print("x is a" if x == "a" else "x is b" if x == "b" else "other")
実行結果
x is a
サンプルコード
x, y = "a", 1
print("a", y) if x == "a" else print("b", y) if x == "b" else print("other")
実行結果
a 1

if/in

サンプルコード
x = "abc"
print("True" if "ab" in x else "False")
実行結果
True
サンプルコード
x = ["a", "b", "c"]
print("True" if "a" in x else "False")
実行結果
True
サンプルコード
x = [1, 2, 3]
print("True" if 1 in x else "False")
実行結果
True

複数の条件式

サンプルコード
x = 1
y = 1
z = 1
print("True" if x == y == z else "False")
実行結果
True
サンプルコード
a = 1
b = 2
c = 3
d = 4
print("True" if a < b < c < d else "False")
実行結果
True

3.2 繰り返し文

for

サンプルコード
for i in range(5):
    print(i)
実行結果
0
1
2
3
4
サンプルコード
for i in range(2, 5):
    print(i)
実行結果
2
3
4
サンプルコード
for i in range(2, 5, 2):
    print(i)
実行結果
2
4
サンプルコード
x = ["a", "b", "c"]
for i in x:
    print(i)
実行結果
a
b
c
サンプルコード
X = ["a", "b", "c"]
Y = [1, 2, 3]
for x, y in zip(X, Y):
    print(x, y)
実行結果
a 1
b 2
c 3

for/else

サンプルコード
x = False
for i in range(5):
    if x:
        print("True")
        break
else:
    print("False")
実行結果
False

while

サンプルコード
i = 0
while i < 5:
    print(i)
    i += 1
実行結果
0
1
2
3
4

第4章 組み込み型観点

4.1 int

サンプルコード
print(int(2.9))
実行結果
2
サンプルコード
print(int(3.0))
実行結果
3
サンプルコード
print(int(3.1))
実行結果
3
サンプルコード
print(int(-2.9))
実行結果
-2
サンプルコード
print(int(-3.0))
実行結果
-3
サンプルコード
print(int(-3.1))
実行結果
-3

10進数への変換

2進数⇒10進数

サンプルコード
print(int("10", 2))
実行結果
2

8進数⇒10進数

サンプルコード
print(int("10", 8))
実行結果
8

16進数⇒10進数

サンプルコード
print(int("10", 16))
実行結果
16

bit_length

  • int.bit_length():整数を符号と先頭の0は除いて二進法で表すために必要なビットの数を返す
サンプルコード
N = 10
print(N.bit_length())
実行結果
4

4.2 float

サンプルコード
print(float(1))
実行結果
1.0
サンプルコード
print(1+0.0)
実行結果
1.0
サンプルコード
print(5e10)
実行結果
50000000000.0
サンプルコード
print(1.1e-3)
実行結果
0.0011

整数判定

  • float.is_integer():浮動小数点数が整数値ならTrueを、そうでなければFalseを返す
サンプルコード
x = 1.0
print(x.is_integer())
実行結果
True
サンプルコード
x = 1.1
print(x.is_integer())
実行結果
False

有効桁数

4.3 str

サンプルコード
print(str(1))
実行結果
1

文字列の連結

サンプルコード
print("foo"+"bar")
実行結果
foobar
サンプルコード
x = "Fizz"
y = "Buzz"
print(x+y)
実行結果
FizzBuzz

文字列の繰り返し

サンプルコード
print("HelloWorld!"*2)
実行結果
HelloWorld!HelloWorld!
サンプルコード
x = "1"
print(x*5)
実行結果
11111

文字列の参照

サンプルコード
x = "abc"
print(x[0], x[1], x[2])
実行結果
a b c
サンプルコード
x = "abc"
print(x[-1], x[-2], x[-3])
実行結果
c b a

文字列の比較

サンプルコード
x = "Hello"
y = "Hello"
print("True" if x == y else "False")
実行結果
True
サンプルコード
x = "Hello"
y = "Good"
print("True" if x == y else "False")
実行結果
False
サンプルコード
x = "a"
y = "b"
print("x < y" if x < y else "x > y")
実行結果
x < y
サンプルコード
x = "b"
y = "a"
print("x < y" if x < y else "x > y")
実行結果
x > y

文字列の逆順

サンプルコード
x = "Hello World!"
print(x[::-1])
実行結果
!dlroW olleH

文字列の出現回数

サンプルコード
x = "abbccc"
print(x.count("c"))
実行結果
3
サンプルコード
x = "abbccc"
print(x.count("d"))
実行結果
0
サンプルコード
x = "123435"
print(x.count("3"))
実行結果
2

文字列の置換

サンプルコード
x = "abcabcabc"
print(x.replace("b", "p"))
実行結果
apcapcapc
サンプルコード
x = "abcabcabc"
print(x.replace("b", "p", 2))
実行結果
apcapcabc

文字列のスライス

サンプルコード
x = "012345"
print(x[1:4])
実行結果
123
サンプルコード
x = "012345"
print(x[1:4:2])
実行結果
13
サンプルコード
x = "012345"
print(x[:3])
実行結果
012
サンプルコード
x = "012345"
print(x[3:])
実行結果
345
サンプルコード
x = "012345"
print(x[:-1])
実行結果
01234
サンプルコード
x = "012345"
print(x[-1:])
実行結果
5
サンプルコード
x = "012345"
print(x[::2])
実行結果
024
サンプルコード
x = "012345"
print(x[1::2])
実行結果
135
サンプルコード
x = "012345"
print(x[:-1:2])
実行結果
024
サンプルコード
x = "012345"
print(x[::-1])
実行結果
543210
サンプルコード
x = "012345"
print(x[::-2])
実行結果
531

文字列の探索

  • str.index():文字列の探索
サンプルコード
x = "abcabc"
print(x.index("c"))
実行結果
2
サンプルコード
x = "abcabc"
print(x.index("bc"))
実行結果
1
サンプルコード
x = "abcabc"
print(x.index("z"))
実行結果
ValueError: substring not found

文字列のユニーク化

サンプルコード
x = "abcabc"
print(set(x))
実行結果
{'a', 'c', 'b'}

文字列のコピー

サンプルコード
x = "Hello World!"
y = x[:5]
print(y)
実行結果
Hello
サンプルコード
x = "Hello World!"
y = x[:-1]
print(y)
実行結果
Hello World

文字列の判定

  • str.isdecimal():文字列中の全ての文字が十進数字で、かつ 1 文字以上あるならTrueを、そうでなければFalseを返す
  • str.isdigit():文字列中の全ての文字が数字で、かつ 1 文字以上あるならTrueを、そうでなければFalseを返す
  • str.isnumeric():文字列中の全ての文字が数を表す文字で、かつ 1 文字以上あるならTrueを、そうでなければFalseを返す
  • str.isalpha():文字列中の全ての文字が英字で、かつ 1 文字以上あるならTrueを、そうでなければFalseを返す
  • str.isalnum():文字列中の全ての文字が英数字で、かつ 1 文字以上あるならTrueを、そうでなければFalseを返す
サンプルコード
x = "1234567890"
print(x.isdecimal())
実行結果
True
サンプルコード
x = "10"
print(x.isdigit())
実行結果
True
サンプルコード
x = "一二三四五六七八九〇壱億参阡萬"
print(x.isnumeric())
実行結果
True
サンプルコード
x = "abcあいうアイウ漢字"
print(x.isalpha())
実行結果
True
サンプルコード
x = "abc100"
print(x.isalnum())
実行結果
True

文字列の検索

サンプルコード
x = "abcabcabc"
print(x.find("b"))
実行結果
1
サンプルコード
x = "abcabcabc"
print(x.find("b", 3, 9))
実行結果
4
サンプルコード
x = "abcabcabc"
print(x.find("z"))
実行結果
-1
サンプルコード
x = "abcabcabc"
print(x.rfind("b"))
実行結果
7
サンプルコード
x = "abcabcabc"
print(x.rfind("b", 0, 6))
実行結果
4
サンプルコード
x = "abcabcabc"
print(x.rfind("z"))
実行結果
-1

大文字小文字変換

  • str.upper():すべての文字列を大文字に変換する
  • str.lower():すべての文字列を小文字に変換する
  • str.capitalize():文字列の先頭文字を大文字に変換する
  • str.title():各単語の先頭文字を大文字に変換する
サンプルコード
x = "this is a pen."
print(x.upper())
実行結果
THIS IS A PEN.
サンプルコード
x = "THIS IS A PEN."
print(x.lower())
実行結果
this is a pen.
サンプルコード
x = "this is a pen."
print(x.capitalize())
実行結果
This is a pen.
サンプルコード
x = "this is a pen."
print(x.title())
実行結果
This Is A Pen.

大文字小文字判定

サンプルコード
x = "ABC"
print(x.isupper())
実行結果
True
サンプルコード
x = "abc"
print(x.islower())
実行結果
True

文字列の変換

サンプルコード
x = "this is a pen."
print(x.translate(str.maketrans({"t": "T", " ": None, ".": "!"})))
実行結果
Thisisapen!
サンプルコード
x = "bcad"
print(x.translate(str.maketrans("abcd", "1234")))
実行結果
2314

文字列のエンコード/デコード

  • str.encode():文字列のエンコードされたバージョンをバイト列オブジェクトとして返す
  • bytes.decode():与えられたバイト列からデコードされた文字列を返す
サンプルコード
x = "abcd"
print(x.encode())
print(bytes(i+1 for i in x.encode()).decode())
実行結果
b'abcd'
bcde

文字列のゼロ埋め

  • str.zfill():左詰めした文字列のコピーを返す
サンプルコード
N = "10"
print(N.zfill(4))
実行結果
0010

f文字列

サンプルコード
実行結果

4.4 list

要素の参照

サンプルコード
x = ["a", "b", "c"]
print(x[0], x[1], x[2])
実行結果
a b c
サンプルコード
x = ["a", "b", "c"]
print(x[-1], x[-2], x[-3])
実行結果
c b a

要素の追加

サンプルコード
x = ["a", "b", "c"]
x.append("d")
print(x)
実行結果
['a', 'b', 'c', 'd']
サンプルコード
x = [0, 1, 2]
x.append(3)
print(x)
実行結果
[0, 1, 2, 3]
サンプルコード
x = ["a", "b", "c"]
x.append(["d", "e"])
print(x)
実行結果
['a', 'b', 'c', ['d', 'e']]

要素の拡張

サンプルコード
x = ["a", "b", "c"]
x.extend(["d", "e"])
print(x)
実行結果
['a', 'b', 'c', 'd', 'e']

要素の挿入

サンプルコード
x = ["a", "b", "c"]
x.insert(1, "z")
print(x)
実行結果
['a', 'z', 'b', 'c']
サンプルコード
x = ["a", "b", "c"]
x.insert(1, ["x", "y"])
print(x)
実行結果
['a', ['x', 'y'], 'b', 'c']

要素の探索

サンプルコード
x = ["a", "b", "c", "d", "e", "f"]
print(x.index("c"))
実行結果
2
サンプルコード
x = ["a", "b", "c", "d", "c", "c"]
print(x.index("c"))
実行結果
2
サンプルコード
x = [1, 2, 3, 4, 5]
print(x.index(3))
実行結果
2
サンプルコード
x = ["a", "b", "c", "d", "c", "c"]
print(x.index("z"))
実行結果
ValueError: 'z' is not in list

要素の取り出し

サンプルコード
x = ["a", "b", "c", "d", "e", "f"]
print(x.pop(1))
print(x)
実行結果
b
['a', 'c', 'd', 'e', 'f']
サンプルコード
x = [1, 2, 3, 4, 5]
print(x.pop(3))
print(x)
実行結果
4
[1, 2, 3, 5]
サンプルコード
x = [1, 2, 3, 4, 5]
print(x.pop())
print(x)
実行結果
5
[1, 2, 3, 4]
サンプルコード
x = []
print(x.pop())
実行結果
IndexError: pop from empty list

要素の取り除き

サンプルコード
x = ["a", "b", "c", "d", "e", "f"]
x.remove("d")
print(x)
実行結果
['a', 'b', 'c', 'e', 'f']
サンプルコード
x = ["a", "a", "b", "b", "c", "c"]
x.remove("b")
print(x)
実行結果
['a', 'a', 'b', 'c', 'c']
サンプルコード
x = ["a", "a", "b", "b", "c", "c"]
x.remove("z")
print(x)
実行結果
ValueError: list.remove(x): x not in list

要素の削除

サンプルコード
x = ["a", "b", "c", "d", "e", "f"]
del x[1]
print(x)
実行結果
['a', 'c', 'd', 'e', 'f']
サンプルコード
x = ["a", "b", "c", "d", "e", "f"]
del x[-1]
print(x)
実行結果
['a', 'b', 'c', 'd', 'e']
サンプルコード
x = ["a", "b", "c", "d", "e", "f"]
del x[2:4]
print(x)
実行結果
['a', 'b', 'e', 'f']
サンプルコード
x = ["a", "b", "c", "d", "e", "f"]
del x[:]
print(x)
実行結果
[]

要素の出現回数

サンプルコード
x = ["a", "b", "b", "c", "c", "c"]
print(x.count("c"))
実行結果
3
サンプルコード
x = ["a", "b", "b", "c", "c", "c"]
print(x.count("d"))
実行結果
0
サンプルコード
x = [1, 2, 3, 4, 3, 5]
print(x.count(3))
実行結果
2

要素の結合

サンプルコード
x = ["a", "b", "c", "d", "e"]
print("".join(x))
実行結果
abcde
サンプルコード
x = ["a", "b", "c", "d", "e"]
print(",".join(x))
実行結果
a,b,c,d,e
サンプルコード
x = ["a", "b", "c", "d", "e"]
print(" ".join(x))
実行結果
a b c d e

要素のユニーク化

サンプルコード
x = [1, 2, 3, 2, 1, 3]
print(list(set(x)))
実行結果
[1, 2, 3]
サンプルコード
x = ["b", "a", "c", "a", "b"]
print(list(set(x)))
実行結果
['b', 'c', 'a']
サンプルコード
x = [[1, 0], [0, 0], [1, 1], [1, 0], [0, 1], [0, 0]]
print(list(map(list, set(map(tuple, x)))))
実行結果
[[1, 0], [0, 1], [1, 1], [0, 0]]

要素のスライス

サンプルコード
x = ["0", "1", "2", "3", "4", "5"]
print(x[1:4])
実行結果
['1', '2', '3']
サンプルコード
x = ["0", "1", "2", "3", "4", "5"]
print(x[1:4:2])
実行結果
['1', '3']
サンプルコード
x = ["0", "1", "2", "3", "4", "5"]
print(x[:3])
実行結果
['0', '1', '2']
サンプルコード
x = ["0", "1", "2", "3", "4", "5"]
print(x[3:])
実行結果
['3', '4', '5']
サンプルコード
x = ["0", "1", "2", "3", "4", "5"]
print(x[:-1])
実行結果
['0', '1', '2', '3', '4']
サンプルコード
x = ["0", "1", "2", "3", "4", "5"]
print(x[-1:])
実行結果
['5']
サンプルコード
x = ["0", "1", "2", "3", "4", "5"]
print(x[::2])
実行結果
['0', '2', '4']
サンプルコード
x = ["0", "1", "2", "3", "4", "5"]
print(x[1::2])
実行結果
['1', '3', '5']
サンプルコード
x = ["0", "1", "2", "3", "4", "5"]
print(x[:-1:2])
実行結果
['0', '2', '4']
サンプルコード
x = ["0", "1", "2", "3", "4", "5"]
print(x[::-1])
実行結果
['5', '4', '3', '2', '1', '0']
サンプルコード
x = ["0", "1", "2", "3", "4", "5"]
print(x[::-2])
実行結果
['5', '3', '1']

リスト内包表記

サンプルコード
x = [i for i in range(10)]
print(x)
実行結果
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
サンプルコード
x = [i for i in range(10) if i % 2 == 0]
print(x)
実行結果
[0, 2, 4, 6, 8]
サンプルコード
x = [i//2 for i in range(10) if i % 2 == 0]
print(x)
実行結果
[0, 1, 2, 3, 4]
サンプルコード
x = [2, 4, 6, 8, 10]
x = [i//2 for i in x]
print(x)
実行結果
[1, 2, 3, 4, 5]
サンプルコード
x = [1*i + 10*j + 100*k for k in range(2) for j in range(3) for i in range(4)]
print(x)
実行結果
[0, 1, 2, 3, 10, 11, 12, 13, 20, 21, 22, 23, 100, 101, 102, 103, 110, 111, 112, 113, 120, 121, 122, 123]

要素のソート

サンプルコード
x = [[0, 1], [1, 1], [1, 0], [0, 0]]
x.sort(key=lambda x: (x[0], x[1]))
for i in x:
    print(i)
実行結果
[0, 0]
[0, 1]
[1, 0]
[1, 1]
サンプルコード
x = [[0, 1], [1, 1], [1, 0], [0, 0]]
x.sort(key=lambda x: (x[0], -x[1]))
for i in x:
    print(i)
実行結果
[0, 1]
[0, 0]
[1, 1]
[1, 0]
サンプルコード
x = [[0, 1], [1, 1], [1, 0], [0, 0]]
x.sort(key=lambda x: (-x[0], -x[1]))
for i in x:
    print(i)
実行結果
[1, 1]
[1, 0]
[0, 1]
[0, 0]
サンプルコード
x = [[0, 1], [1, 1], [1, 0], [0, 0]]
x.sort(key=lambda x: (x[0], x[1]), reverse=True)
for i in x:
    print(i)
実行結果
[1, 1]
[1, 0]
[0, 1]
[0, 0]

4.5 tuple

要素の参照

サンプルコード
x = ("Hello", "World", 1)
print(x)
print(x[0])
実行結果
('Hello', 'World', 1)
Hello

4.6 dict

要素の参照

サンプルコード
x = {"a": 1, "b": 2, "c": 3}
print(x["a"])
実行結果
1
サンプルコード
x = dict(a=1, b=2, c=3)
print(x["a"])
実行結果
1

要素の集計

サンプルコード
keys = ["a", "b", "c", "b", "a", "b"]
dictionary = {}
for key in keys:
    if key in dictionary:
        dictionary[key] += 1
    else:
        dictionary[key] = 1
print(dictionary)
実行結果
{'a': 2, 'b': 3, 'c': 1}

4.7 set

  • 集合型
  • set:オブジェクトの順序なしコレクション

A \cup B
サンプルコード
print({"a", "b", "c"} | {"c", "d", "e"})
実行結果
{'a', 'b', 'd', 'e', 'c'}

A - B
サンプルコード
print({"a", "b", "c"} - {"c", "d", "e"})
実行結果
{'a', 'b'}

A \cap B
サンプルコード
print({"a", "b", "c"} & {"c", "d", "e"})
実行結果
{'c'}

対称差

A ⊕ B
サンプルコード
print({"a", "b", "c"} ^ {"c", "d", "e"})
実行結果
{'a', 'b', 'e', 'd'}

部分集合

A \subseteq B
サンプルコード
print({"a", "b"} <= {"a", "b", "c"})
実行結果
True
サンプルコード
print({"a", "z"} <= {"a", "b", "c"})
実行結果
False

文字の集合

サンプルコード
import string
x = string.ascii_lowercase
print(x)
実行結果
abcdefghijklmnopqrstuvwxyz
サンプルコード
x = sorted(map(chr, range(97, 123)))
print(x)
実行結果
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
サンプルコード
x = sorted(map(chr, range(65, 91)))
print(x)
実行結果
['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']

4.8 range

サンプルコード
r = range(2, 10)
print(r)
実行結果
range(2, 10)
サンプルコード
r = range(2, 10)
print(r[:3])
実行結果
range(2, 5)
サンプルコード
r = range(2, 10)
print(set(r[:3]))
実行結果
{2, 3, 4}
サンプルコード
r = range(2, 10)
print(r[3:])
実行結果
range(5, 10)
サンプルコード
r = range(2, 10)
print(set(r[3:]))
実行結果
{5, 6, 7, 8, 9}
サンプルコード
r = range(2, 10)
print(r[-3:])
実行結果
range(7, 10)
サンプルコード
r = range(2, 10)
print(set(r[-3:]))
実行結果
{8, 9, 7}
サンプルコード
r = range(2, 10)
print(r[:-3])
実行結果
range(2, 7)
サンプルコード
r = range(2, 10)
print(set(r[:-3]))
実行結果
{2, 3, 4, 5, 6}

第5章 組み込み関数観点

5.1 abs

  • abs():絶対値を返す
サンプルコード
x = -1
print(abs(x))
実行結果
1
サンプルコード
x = -1.1
print(abs(x))
実行結果
1.1

5.2 all

  • all():iterable の全ての要素が真ならば(もしくは iterable が空ならば)True、そうでない場合はFalseを返す
サンプルコード
print(all([True, True]))
実行結果
True
サンプルコード
print(all([True, False]))
実行結果
False
サンプルコード
print(all([False, False]))
実行結果
False

5.3 any

  • any():iterable のいずれかの要素が真ならばTrue、空ならFalseを返す
サンプルコード
print(any([True, True]))
実行結果
True
サンプルコード
print(any([True, False]))
実行結果
True
サンプルコード
print(any([False, False]))
実行結果
False

5.4 bin/oct/hex

  • bin():整数を先頭に0bが付いた2進文字列に変換する
  • oct():整数を先頭に0oが付いた8進文字列に変換する
  • hex():整数を先頭に0xが付いた16進文字列に変換する

10進数⇒2進数

サンプルコード
print(bin(2))
実行結果
0b10

10進数⇒8進数

サンプルコード
print(oct(8))
実行結果
0o10

10進数⇒16進数

サンプルコード
print(hex(16))
実行結果
0x10

10進数⇒2進数

サンプルコード
print(0b10)
実行結果
2

10進数⇒8進数表示

サンプルコード
print(0o10)
実行結果
8

10進数⇒16進数表示

サンプルコード
print(0x10)
実行結果
16

2進数⇒10進数

サンプルコード
print(int("10", 2))
実行結果
2

8進数⇒10進数

サンプルコード
print(int("10", 8))
実行結果
8

16進数⇒10進数

サンプルコード
print(int("10", 16))
実行結果
16

5.5 divmod

  • divmod():複素数でない2つの数を引数として取り、除算を行ったときの商と剰余からなる対を返す
サンプルコード
a, b = divmod(5, 2)
print(a, b)
実行結果
2 1

5.6 enumerate

  • enumerate():カウントと iterable 上の iteration によって得られた値を含むタプルを返す
サンプルコード
x = ["a", "b", "c"]
for number, alphabet in enumerate(x):
    print(number, alphabet)
実行結果
0 a
1 b
2 c

5.7 eval

サンプルコード
print(eval("1+2"))
実行結果
3

5.8 len

  • len():オブジェクトの長さ(要素の数)を返す
サンプルコード
print(len("aiueo"))
実行結果
5
サンプルコード
print(max(["abc", "d", "ef", "ghij"], key=len))
実行結果
ghij
サンプルコード
print(min(["abc", "d", "ef", "ghij"], key=len))
実行結果
d

5.9 map

  • map():function の結果を返しながら、全ての要素に適用する iterator を返す
入力
1 2
サンプルコード
x, y = map(float, input().split())
print(x, y)
実行結果
1.0 2.0
入力
-1 -2
サンプルコード
x, y = map(abs, map(int, input().split()))
print(x, y)
実行結果
1 2
サンプルコード
x = [[1, 6, 8], [3, 5, 7], [2, 4, 9]]
a, b, c = map(max, zip(*x))
print(a, b, c)
実行結果
3 6 9
サンプルコード
x = list(map(str, range(1, 5)))
print(x)
実行結果
['1', '2', '3', '4']

5.10 max

  • max():iterable の中で最大の要素、または2つ以上の引数の中で最大のものを返す
サンプルコード
print(max(1, 2))
実行結果
2
サンプルコード
print(max(2, 1, 3))
実行結果
3
サンプルコード
print(max([2, 1, 3]))
実行結果
3
サンプルコード
print(max(["b", "a", "c", "d"]))
実行結果
d
サンプルコード
print(max(["ab", "aa", "ca", "bd"]))
実行結果
ca
サンプルコード
print(max(["a", "bcde", "fg", "hij"], key=len))
実行結果
bcde
サンプルコード
x = ["a", "b", "c", "b"]
print(max(x, key=x.count))
実行結果
b

5.11 min

  • min():iterable の中で最小の要素、または2つ以上の引数の中で最小のものを返す
サンプルコード
print(min(1, 2))
実行結果
1
サンプルコード
print(min(2, 1, 3))
実行結果
1
サンプルコード
print(min([2, 1, 3]))
実行結果
1
サンプルコード
print(min(["b", "a", "c", "d"]))
実行結果
a
サンプルコード
print(min(["ab", "aa", "ca", "bd"]))
実行結果
aa
サンプルコード
print(min(["a", "bcde", "fg", "hij"], key=len))
実行結果
a
サンプルコード
x = ["a", "b", "c", "b", "c", "c"]
print(min(x, key=x.count))
実行結果
a

5.12 ord/chr

  • ord():1 文字の Unicode 文字を表す文字列に対し、その文字の Unicode コードポイントを表す整数を返す
  • chr():Unicode コードポイントが整数である文字を表す文字列を返す
サンプルコード
print([chr(i) for i in range(97, 97+26)])
実行結果
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
サンプルコード
print([chr(i) for i in range(ord("a"),ord("z")+1)])
実行結果
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
サンプルコード
x = "abc"
[print(chr(i), end=" ") for i in range(ord("a"), ord("z")+1) if chr(i) in x]
実行結果
a b c

5.13 pow

  • pow():べき乗を返す
サンプルコード
print(pow(3, 2))
実行結果
9
サンプルコード
print(pow(3, 1000, 10**9+7))
実行結果
56888193

5.14 sorted

  • sorted():iterable の要素を並べ替えた新たなリストを返す

昇順

サンプルコード
x = [2, 1, 3]
print(sorted(x))
実行結果
[1, 2, 3]

降順

サンプルコード
x = [2, 1, 3]
print(sorted(x)[::-1])
実行結果
[3, 2, 1]

5.15 split

サンプルコード
x = "Hello,World"
print(*x.split(","))
実行結果
Hello World

5.16 strip/rstrip/lstrip

  • strip():文字列の先頭および末尾部分を除去したコピーを返す
  • rstrip():字列の末尾部分を除去したコピーを返す
  • lstrip():文字列の先頭の文字を除去したコピーを返す
サンプルコード
x = "0012300"
print(x.strip("0"))
print(x.rstrip("0"))
print(x.lstrip("0"))
実行結果
123
00123
12300

5.17 sum

  • sum():合計を返す
サンプルコード
x = [1, 2, 3]
print(sum(x))
実行結果
6

数字和

サンプルコード
x = 1234
print(sum(map(int, str(x))))
実行結果
10
サンプルコード
x = "1234"
print(sum(map(int, x)))
実行結果
10

5.18 zip

  • zip():それぞれの iterable から要素を集めた iterator を作り、タプルを返す
サンプルコード
X = [1, 2, 3]
Y = ["a", "b", "c"]
for x, y in zip(X, Y):
    print(x, y)
実行結果
1 a
2 b
3 c
サンプルコード
x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print(x)
print(list(map(list, zip(*x))))
実行結果
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]

第6章 モジュール観点

6.1 bisect

bisect_left / bisect_right

サンプルコード
import bisect
x = [1, 3, 5, 7, 9]

print(bisect.bisect_left(x, 5))
# 2
"""
x = [1, 3, 5, 7, 9]
     1  2  3  4  5
        ^
"""

print(bisect.bisect_right(x, 5))
# 3
"""
x = [1, 3, 5, 7, 9]
     1  2  3  4  5
           ^
"""

print(bisect.bisect_left(x, 6))
# 3
"""
x = [1, 3, 5, 7, 9]
     1  2  3  4  5
           ^
"""

print(bisect.bisect_right(x, 6))
# 3
"""
x = [1, 3, 5, 7, 9]
     1  2  3  4  5
           ^
"""

x = [1, 1, 1, 3, 3, 3, 5, 5, 5]

print(bisect.bisect_left(x, 3))
# 3
"""
x = [1, 1, 1, 3, 3, 3, 5, 5, 5]
     1  2  3  4  5  6  7  8  9
           ^
"""

print(bisect.bisect_right(x, 3))
# 6
"""
x = [1, 1, 1, 3, 3, 3, 5, 5, 5]
     1  2  3  4  5  6  7  8  9
                    ^
"""

print(bisect.bisect_left(x, 4))
# 6
"""
x = [1, 1, 1, 3, 3, 3, 5, 5, 5]
     1  2  3  4  5  6  7  8  9
                    ^
"""

print(bisect.bisect_right(x, 4))
# 6
"""
x = [1, 1, 1, 3, 3, 3, 5, 5, 5]
     1  2  3  4  5  6  7  8  9
                    ^
"""

6.2 calendar

  • calendar:一般的なカレンダーに関する関数群

isleap

サンプルコード
import calendar
print(calendar.isleap(2020))
実行結果
True

leapdays

サンプルコード
import calendar
print(calendar.leapdays(2020, 2025))
実行結果
2

6.3 collections

Counter

サンプルコード
import collections
x = ["a", "a", "a", "a", "b", "c", "c"]
c = collections.Counter(x)
print(c)
# Counter({'a': 4, 'c': 2, 'b': 1})

print(type(c))
# <class 'collections.Counter'>

print(issubclass(type(c), dict))
# True

print(c.keys())
# dict_keys(['a', 'b', 'c'])

print(c.values())
# dict_values([4, 1, 2])

print(c.items())
# dict_items([('a', 4), ('b', 1), ('c', 2)])

print(c.most_common())
# [('a', 4), ('c', 2), ('b', 1)]

print(c.most_common()[0])
# ('a', 4)

print(c.most_common()[-1])
# ('b', 1)

print(c.most_common()[0][0])
# a

print(c.most_common()[0][1])
# 4

print(c.most_common()[::-1])
# [('b', 1), ('c', 2), ('a', 4)]

print(c.most_common(2))
# [('a', 4), ('c', 2)]

values, counts = zip(*c.most_common())
print(values)
# ('a', 'c', 'b')

print(counts)
# (4, 2, 1)

print(c["a"])
# 4

print(c["b"])
# 1

print(c["c"])
# 2

print(c["d"])
# 0

deque

サンプルコード
import collections
queue = collections.deque(["a", "b", "c"])
queue.append("d")
print(queue)
queue.popleft()
print(queue)
実行結果
deque(['a', 'b', 'c', 'd'])
deque(['b', 'c', 'd'])

defaultdict

サンプルコード
import collections
x = [("a", 1), ("b", 1), ("a", 2), ("c", 2)]
d = collections.defaultdict(list)
for key, value in x:
    d[key].append(value)
print(d)
実行結果
defaultdict(<class 'list'>, {'a': [1, 2], 'b': [1], 'c': [2]})

6.4 datetime

サンプルコード
サンプルコード
実行結果
実行結果

6.5 decimal

サンプルコード
サンプルコード
実行結果
実行結果

6.7 fractions

gcd

サンプルコード
サンプルコード
実行結果
実行結果

6.6 functools

  • functools:高階関数と呼び出し可能オブジェクトの操作

reduce

サンプル
from functools import reduce
from operator import add
from operator import sub
from operator import mul
x = [20, 1, 2, 3, 4, 5]
print(reduce(add, x))
# 35(=20+1+2+3+4+5)
print(reduce(sub, x))
# 5(=20-1-2-3-4-5)
print(reduce(mul, x))
# 2300(=20*1*2*3*4*5)

# Lambda式に変換が可能
print(reduce(lambda a, b: a+b, x))  # 35
print(reduce(lambda a, b: a-b, x))  # 5
print(reduce(lambda a, b: a*b, x))  # 2400

6.8 heapq

  • heapq:ヒープキューアルゴリズム

heappush / heappop

サンプルコード
import heapq
hq = [2, -20, 5, 0, -1, 100, 27]
heapq.heappush(hq, -30)
print(hq)
heapq.heappop(hq)
print(hq)
実行結果
[-30, 2, 5, -20, -1, 100, 27, 0]
[2, -20, 5, 0, -1, 100, 27]

nlargest / nsmallest

サンプルコード
import heapq
hq = [2, -20, 5, 0, -1, 100, 27]
print(heapq.nlargest(3, hq))
print(heapq.nsmallest(3, hq))
実行結果
[100, 27, 5]
[-20, -1, 0]

heapreplace

サンプルコード
サンプルコード
実行結果
実行結果

6.9 itertools

  • itertools:効率的なループ実行のための iterator 生成関数

accumulate

サンプルコード
サンプルコード
実行結果
実行結果

combinations

_4 C _2 = \frac{_4 P _2}{2!} = 6通り
サンプル
from itertools import combinations
x = ["a", "b", "c", "d"]
print(list(combinations(x, 2)))
print(len(list(combinations(x, 2))))
実行結果
[('a', 'b'), ('a', 'c'), ('a', 'd'), ('b', 'c'), ('b', 'd'), ('c', 'd')]
6
サンプルコード
from itertools import combinations
for a, b, c in combinations("MARCH", 3):
    print(a, b, c)
実行結果
M A R
M A C
M A H
M R C
M R H
M C H
A R C
A R H
A C H
R C H

combinations_with_replacement

サンプルコード
from itertools import combinations_with_replacement
x = ["a", "b", "c", "d"]
print(list(combinations_with_replacement(x, 3)))
実行結果
[('a', 'a', 'a'), ('a', 'a', 'b'), ('a', 'a', 'c'), ('a', 'a', 'd'), ('a', 'b', 'b'), ('a', 'b', 'c'), ('a', 'b', 'd'), ('a', 'c', 'c'), ('a', 'c', 'd'), ('a', 'd', 'd'), ('b', 'b', 'b'), ('b', 'b', 'c'), ('b', 'b', 'd'), ('b', 'c', 'c'), ('b', 'c', 'd'), ('b', 'd', 'd'), ('c', 'c', 'c'), ('c', 'c', 'd'), ('c', 'd', 'd'), ('d', 'd', 'd')]
サンプルコード
from itertools import combinations_with_replacement
x = ["a", "b", "c", "d"]
print(len(list(combinations_with_replacement(x, 3))))
実行結果
20

groupby

サンプルコード
サンプルコード
実行結果
実行結果

permutations

4! = 4 × 3 × 2 × 1 = 24通り
サンプルコード
from itertools import permutations
x = ["a", "b", "c", "d", "e"]
print(list(permutations(x)))
print(len(list(permutations(x))))
実行結果
[('a', 'b', 'c', 'd'), ('a', 'b', 'd', 'c'), ('a', 'c', 'b', 'd'), ('a', 'c', 'd', 'b'), ('a', 'd', 'b', 'c'), ('a', 'd', 'c', 'b'), ('b', 'a', 'c', 'd'), ('b', 'a', 'd', 'c'), ('b', 'c', 'a', 'd'), ('b', 'c', 'd', 'a'), ('b', 'd', 'a', 'c'), ('b', 'd', 'c', 'a'), ('c', 'a', 'b', 'd'), ('c', 'a', 'd', 'b'), ('c', 'b', 'a', 'd'), ('c', 'b', 'd', 'a'), ('c', 'd', 'a', 'b'), ('c', 'd', 'b', 'a'), ('d', 'a', 'b', 'c'), ('d', 'a', 'c', 'b'), ('d', 'b', 'a', 'c'), ('d', 'b', 'c', 'a'), ('d', 'c', 'a', 'b'), ('d', 'c', 'b', 'a')]
24
_4 P _2 = 4 \times 3 = 12通り
サンプルコード
from itertools import permutations
x = ["a", "b", "c"]
print(list(permutations(x, 2)))
print(len(list(permutations(x, 2))))
実行結果
[('a', 'b'), ('a', 'c'), ('a', 'd'), ('b', 'a'), ('b', 'c'), ('b', 'd'), ('c', 'a'), ('c', 'b'), ('c', 'd'), ('d', 'a'), ('d', 'b'), ('d', 'c')]
12

product

サンプルコード
サンプルコード
実行結果
実行結果

6.10 math

  • math:数学関数

cos

サンプルコード
サンプルコード
実行結果
実行結果

factorial

サンプルコード
サンプルコード
実行結果
実行結果

floor

サンプルコード
import math
print(math.floor(5/3))
実行結果
1
サンプルコード
import math
print(math.floor(6/3))
実行結果
2

gcd

サンプルコード
サンプルコード
実行結果
実行結果

log

サンプルコード
サンプルコード
実行結果
実行結果

pi

サンプルコード
import math
print(math.pi)
実行結果
3.141592653589793

radians

サンプルコード
サンプルコード
実行結果
実行結果

sqrt

サンプルコード
import math
print(math.sqrt(4))
実行結果
2.0

6.11 numpy

argsort

サンプルコード
サンプルコード
実行結果
実行結果

argwhere

サンプルコード
サンプルコード
実行結果
実行結果

array

サンプルコード
サンプルコード
実行結果
実行結果

array

サンプルコード
サンプルコード
実行結果
実行結果

diff

サンプルコード
サンプルコード
実行結果
実行結果

norm

サンプルコード
サンプルコード
実行結果
実行結果

6.12 re

  • re:正規表現操作(Regular Expression operations)

findall

  • re.findall():string 中の pattern による重複しないマッチを文字列のリストとして返す
サンプルコード
サンプルコード
実行結果
実行結果

fullmatch

サンプルコード
サンプルコード
実行結果
実行結果

match

サンプルコード
サンプルコード
実行結果
実行結果

search

サンプルコード
サンプルコード
実行結果
実行結果

split

  • re.split():string を pattern で分割し、リストを返す
サンプルコード
サンプルコード
実行結果
実行結果

sub

  • re.sub():string を重複しない pattern を置換した文字列を返す
サンプルコード
サンプルコード
実行結果
実行結果

FF

6.13 sys

setrecursionlimit

サンプルコード
サンプルコード
実行結果
実行結果

第7章 データ構造観点

7.1 スタック

  • スタック:Stack
サンプルコード
stack = [3, 4, 5]
stack.append(6)
print(stack)
stack.pop()
print(stack)
実行結果
[3, 4, 5, 6]
[3, 4, 5]
サンプルコード
stack = ["a", "b", "c"]
stack.pop()
print(stack)
stack.append("d")
print(stack)
実行結果
['a', 'b']
['a', 'b', 'd']
サンプルコード
import queue
q = queue.LifoQueue()
x = [3, 4, 5]
for l in x:
    q.put(l)
while not q.empty():
    print(q.get())
実行結果
5
4
3

7.2 キュー

  • キュー:Queue
サンプルコード
queue = [3, 4, 5]
queue.append(6)
print(queue)
queue.pop(0)
print(queue)
実行結果
[3, 4, 5, 6]
[4, 5, 6]
サンプルコード
queue = ["a", "b", "c"]
queue.pop(0)
print(queue)
queue.append("d")
print(queue)
実行結果
['b', 'c']
['b', 'c', 'd']
サンプルコード
from collections import deque
queue = deque(["a", "b", "c"])
queue.append("d")
print(queue)
queue.popleft()
print(queue)
実行結果
deque(['a', 'b', 'c', 'd'])
deque(['b', 'c', 'd'])
サンプルコード
import queue
q = queue.Queue()
x = [3, 4, 5]
for l in x:
    q.put(l)
while not q.empty():
    print(q.get())
実行結果
3
4
5

第8章 アルゴリズム観点

8.1 探索

全探索

深さ優先探索(DFS)

  • DFS:Depth First Search

再帰関数を利用

サンプルコード
サンプルコード
実行結果
実行結果

スタックを利用

サンプルコード
サンプルコード
実行結果
実行結果

幅優先探索(BFS)

  • BFS:Breadth First Search
サンプルコード
サンプルコード
実行結果
実行結果

ビット探索

サンプルコード
N = 3
for bit in range(1 << N):
    bit_string = [0]*N
    for digit in range(N):
        if (bit >> digit) & 1:
            bit_string[digit] = 1
        else:
            bit_string[digit] = 0
    print(bit_string)
実行結果
[0, 0, 0]
[1, 0, 0]
[0, 1, 0]
[1, 1, 0]
[0, 0, 1]
[1, 0, 1]
[0, 1, 1]
[1, 1, 1]
サンプルコード
N = 3
for bit in range(1 << N):
    print(bit, end=":{")
    for number in range(N):
        if bit & (1 << number):
            print(number, end=",")
    print("}")
実行結果
0:{}
1:{0,}
2:{1,}
3:{0,1,}
4:{2,}
5:{0,2,}
6:{1,2,}
7:{0,1,2,}

二分探索

順列探索

8.2 シミュレーション

8.3 貪欲法

貪欲法(Greedy Algorithm)

8.4 動的計画法(DP)

  • DP:Dynamic Programming

動的計画法 - Wikipedia

  • フィボナッチ数列
サンプルコード(再帰関数)
def fib(n):
    if n == 0:
        return 0
    if n == 1:
        return 1
    return fib(n-1)+fib(n-2)


N = int(input())
print(fib(N))
サンプルコード(DP)
n = int(input())
dp = [0]*(n+1)
dp[0] = 0
dp[1] = 1
for i in range(2, n+1):
    dp[i] = dp[i-1]+dp[i-2]
print(dp[n])

8.5 UnionFind

8.6 しゃくとり法

8.7 グラフ

8.8 フロー

8.9 エラトステネスのふるい

8.10 ワーシャル・フロイド法

8.11 クラスカル法/プリム法

8.12 ダイクストラ法

第9章 計算量観点

加算

乗算(桁数)

剰余

ソート

つるかめ算

最大公約数(GCD)

いもす法

累積和

  • 累積和:Cumulative sum
サンプルコード
x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
for i in range(1