競技プログラミングを解く中で、よく使う配列操作がいくつかあったのでメモ。
環境
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の回答ではどれも見かけるので、使えるようになっておきたい。