概要
2次元リスト同士の結合について整理。
- 縦方向の結合
append
はループが必要extend
は破壊的に結合- +演算子は非破壊的に結合
- 横方向の結合
extend
でループが必要- +演算子はループの方法に注意
縦方向の結合
appendは要注意
1次元のリストの場合と同じく、append
は引数全体を要素として追加してしまう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
a = [ [1, 2], [3, 4] ] b = [ [5, 6], [7, 8] ] a.append(b) print(a) print(b) # [[1, 2], [3, 4], [[5, 6], [7, 8]]] # [[5, 6], [7, 8]] |
追加されるリストの各行を取り出して追加すれば可能。ただし破壊的。
1 2 3 4 5 6 7 8 |
for r in b: a.append(r) print(a) print(b) # [[1, 2], [3, 4], [5, 6], [7, 8]] # [[5, 6], [7, 8]] |
extendはok(破壊的)
extend
は引数のリストの内容をそのまま追加してくれる。ただし破壊的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
a = [ [1, 2], [3, 4] ] b = [ [5, 6], [7, 8] ] a.extend(b) print(a) print(b) # [[1, 2], [3, 4], [5, 6], [7, 8]] # [[5, 6], [7, 8]] |
+演算子もok(非破壊的)
+演算子もextend
と同じ挙動だが非破壊的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
a = [ [1, 2], [3, 4] ] b = [ [5, 6], [7, 8] ] c = a + b print(a) print(b) print(c) # [[1, 2], [3, 4]] # [[5, 6], [7, 8]] # [[1, 2], [3, 4], [5, 6], [7, 8]] |
横方向の結合
extendで一手間必要
extend
で各要素に追加する場合、各要素をループで取出して追加する必要がある。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
a = [ [1, 2], [3, 4] ] b = [ [5, 6], [7, 8] ] for i in range(len(a)): a[i].extend(b[i]) print(a) print(b) # [[1, 2, 5, 6], [3, 4, 7, 8]] # [[5, 6], [7, 8]] |
カウンターではなく要素を直接取り出してもok。
1 2 3 4 5 6 7 8 |
for ra, rb in zip(a, b): ra.extend(rb) print(a) print(b) # [[1, 2], [3, 4]] # [[5, 6], [7, 8]] |
+演算子は要注意
+演算子で結合する場合は、結果のリストを準備しておく必要がある。このとき、結合するリストと同じ要素数(行数)の空のリストを要素に持つリストを準備しておく必要がある。
また、ループはカウンターを使って添字でリスト要素を指定しなければならない。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
a = [ [1, 2], [3, 4] ] b = [ [5, 6], [7, 8] ] c = [[]] * 2 for i in range(len(a)): c[i] = a[i] + b[i] print(a) print(b) print(c) # [[1, 2], [3, 4]] # [[5, 6], [7, 8]] # [[1, 2, 5, 6], [3, 4, 7, 8]] |
要素を直接取り出して演算した場合、変数が新たに作成されるがその結果は元のリストには反映されないので注意。
1 2 3 4 5 6 7 8 9 10 11 12 |
c = [[]] * 2 for ra, rb, rc in zip(a, b, c): rc = ra + rb print(a) print(b) print(c) # [[1, 2], [3, 4]] # [[5, 6], [7, 8]] # [[], []] |