' P '

whatever I will forget

Python 二次元配列

二次元配列とか多次元配列って名称を忘れていた...
まあそれは置いておいて...

背景1: 入力の方が数値と文字列のMix

入力値が [str, int] で複数渡されるような場合にどうしたらいいんだっけ?となったのでメモ

やりかた

普通にまずはstrで受け取る
それぞれの型に変換する
listに配列の形でappendする

sample_list = []
n = int(input())
for i in range(n):
  s, i = map(str, input().split())
  # intに変換
  i = int(i)
  sample_list.append([s, i])

これで、[[s1, i1], [s2, i2] .... [sn, in]]の二次元配列の完成!

ソート

ちなみ多次元配列をソートしたい場合、最初の要素が比較されるようなので
strをソートしたいのか、intをソートしたいかによってappend時に変数を入れ替える必要がある

たとえば上記のコード例でintで並び替えたい場合:

sample_list.append([i, s])
sort.sample_list()

ってしないと数値で並び替えしてくれないですよ!

背景2: マス目

  • 入力値が下記みたいなやつ.
..#...#
#..#..#
.#####

やりかた

  • 基本上記のようなやつマス目系のやつで、heightやwidthが渡されるので、下記とする.
s = [input() for i in range(height)]
# ['#.#..', '.....', '.#...']
  • さらに、解答用の二次元配列を用意する場合は、下記のように:
    • 1行ずつの文字列を横に1つずつ(indexごとに)見て、値によって初期値を変えている.
result = [[0 if v == '.' else '#' for v in row] for row in s]
# [[0, 0, 0, 0, 0], [0, '#', 0, '#', 0], [0, 0, 0, 0, 0]]
  • もっとわかりやすい例
list2 = [[0 for i in range(3)] for j in range(3)]
print(list2)
# [
#     [0, 0, 0],
#     [0, 0, 0],
#     [0, 0, 0]
# ]

camp.trainocate.co.jp

背景3: 一般的なもの

  • よくある下記のような入力値に対応する二次元配列を作成する
3 2
1 2
5 5
-2 8

やりかた

n, d = map(int, input().split())
x = [list(map(int, input().split())) for _ in range(n)]

print(x) # [[1, 2], [5, 5], [-2, 8]]

背景4: 空の二次元配列の作成

  • 中身のない二次元配列を作成
n = 3
g = [[] for _ in range(n)]
print(g) # [[], [], []]
  • 外側のforがいくつのarrayを作るか、ということになる.
    • すなわち、 array[A][B][A]側.
  • この場合、appendして各indexのarrayに要素を追加する.