Pythonの色んな配列操作

競技プログラミングを解く中で、よく使う配列操作がいくつかあったのでメモ。

環境

Python 3.7.4

map

_ = list(map(str, [1, 2, 3, 4, 5])) # 各要素を文字列型にする
print(_) # ['1', '2', '3', '4', '5']

map関数を使うと、配列の各要素に対して処理を行うことができる。

filter

_ = list(filter(lambda x: x % 2 == 0,  [1, 2, 3, 4, 5])) # 配列から偶数の値のみを取り出す
print(_) # [2, 4]

filter関数を使うと、lambdaを条件に要素を抽出することができる。

reduce

from functools import reduce # import が必要
_ = reduce(lambda x, y: x + y, [1, 2, 3, 4,5]) # ((((1 + 2) + 3) + 4) +5)
print(_) # 15

reduce関数を使うと、2つの引数に対する処理を配列の最初の2つから累積的に行うことができる。
コードの例では、
配列の1, 2がlambdaのx, yに代入され、3となる。
次は、配列の次の値3と、計算した値の3が代入され、6となる。
続いて、配列の次の値の4と、計算した値の6が代入され、10となる
最後に、配列の次の値の5と、計算した値の10が代入され、15となる。

リスト内包表記

 # 配列の各要素を10倍する
_ = [i * 10 for i in[1, 2, 3, 4,5]]
print(_) # [10, 20, 30, 40, 50]

# 二次元配列を作る
_ = [[i, j] for i in range(10) for j in range(10)]
print(_) # [[0, 0], [0, 1], [0, 2], [0, 3], [0, 4], [0, 5], [0, 6], [0, 7], [0, 8], [0, 9], [1, 0], [1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [1, 7], [1, 8], [1, 9], [2, 0], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5], [2, 6], [2, 7], [2, 8], [2, 9], [3, 0], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5], [3, 6], [3, 7], [3, 8], [3, 9], [4, 0], [4, 1], [4, 2], [4, 3], [4, 4], [4, 5], [4, 6], [4, 7], [4, 8], [4, 9], [5, 0], [5, 1], [5, 2], [5, 3], [5, 4], [5, 5], [5, 6], [5, 7], [5, 8], [5, 9], [6, 0], [6, 1], [6, 2], [6, 3], [6, 4], [6, 5], [6, 6], [6, 7], [6, 8], [6, 9], [7, 0], [7, 1], [7, 2], [7, 3], [7, 4], [7, 5], [7, 6], [7, 7], [7, 8], [7, 9], [8, 0], [8, 1], [8, 2], [8, 3], [8, 4], [8, 5], [8, 6], [8, 7], [8, 8], [8, 9], [9, 0], [9, 1], [9, 2], [9, 3], [9, 4], [9, 5], [9, 6], [9, 7], [9, 8], [9, 9]

# map
_ = [str(i) for i in [1, 2, 3, 4, 5]] # 各要素を文字列型にする
print(_) # ['1', '2', '3', '4', '5']

# filter
_ = [i for i in [1, 2, 3, 4, 5] if i % 2 == 0] # 配列から偶数の値のみを取り出す
print(_) # [2, 4]

リスト内包表記を使うと、for文を使った配列処理を簡潔に表現することができる。
リスト内包表記では、map, filterと同じ処理を表現することもできる。
AOJの回答ではどれも見かけるので、使えるようになっておきたい。