Pythonで2次元リストの数値を合計する場合は、sum()を2回使います。
2次元リストとは、次のようにリストの中に複数のリストが入っているデータです。
numbers = [
[10, 20],
[30, 40]
]この記事では、2次元リストについて次の合計方法を解説します。
- すべての数値を合計する
- 行ごとに合計する
- 列ごとに合計する
2次元リスト全体を合計する
2次元リスト内の数値をすべて合計するには、次のように書きます。
numbers = [
[10, 20],
[30, 40]
]
total = sum(sum(row) for row in numbers)
print(total)実行結果は次のとおりです。
100
sum(row)で内側のリストを1行ずつ合計し、外側のsum()で各行の結果をさらに合計しています。
処理の流れは次のようになります。
1行目:10 + 20 = 30
2行目:30 + 40 = 70
全体:30 + 70 = 100
2次元リスト全体を合計するなら、sum(sum(row) for row in numbers)を使うのが簡単です。
sum(numbers)だけでは合計できない
1次元リストの場合は、sum(numbers)だけで合計できます。しかし、2次元リストに同じ書き方を使うとエラーになります。
numbers = [
[10, 20],
[30, 40]
]
total = sum(numbers)
print(total)このコードを実行すると、TypeErrorが発生します。
外側のリストに直接入っているのは数値ではなく、[10, 20]や[30, 40]というリストだからです。
sum()は最初に数値の0を用意して、各要素を順番に加えるような処理をします。そのため、数値の0にリストを加えようとしてエラーになります。
2次元リストでは、まず内側のリストを合計して数値に変える必要があります。
for文で仕組みを確認する
先ほどの処理は、2重のfor文でも書けます。
numbers = [
[10, 20],
[30, 40]
]
total = 0
for row in numbers:
for number in row:
total += number
print(total)実行結果は100です。
外側のfor文で行を取り出し、内側のfor文でその行に含まれる数値を取り出しています。
合計を求めるだけならsum()を使った書き方のほうが短くなります。一方、条件に合う数値だけを足すなど、途中で個別の処理を加えたい場合は2重のfor文が適しています。
行ごとの合計を求める
各行の合計を別々に取得したい場合は、リスト内包表記を使います。
リスト内包表記とは、繰り返し処理を使って新しいリストを作る書き方です。
numbers = [
[10, 20],
[30, 40]
]
row_totals = [sum(row) for row in numbers]
print(row_totals)実行結果は次のとおりです。
[30, 70]
1行目の合計30と、2行目の合計70が新しいリストに格納されています。
テストの点数を生徒ごとに合計する場合や、日ごとの売上を求める場合などに使える方法です。
列ごとの合計を求める
列ごとの合計を求めるには、zip()を使って縦方向の数値をまとめます。
numbers = [
[10, 20],
[30, 40]
]
column_totals = [sum(column) for column in zip(*numbers)]
print(column_totals)実行結果は次のとおりです。
[40, 60]
zip(*numbers)によって、同じ位置にある数値が次のようにまとめられます。
1列目:(10, 30)
2列目:(20, 40)
その後、それぞれにsum()を使うことで、列ごとの合計を計算しています。
ただし、zip()は行の長さが異なる場合、最も短い行に合わせて処理を終了します。列ごとの合計を求めるときは、各行の要素数が同じであることを確認してください。
NumPyを使って合計する方法
データ分析などでNumPyをすでに使用している場合は、配列列のsum()メソッドでも合計できます。
import numpy as np
numbers = np.array([
[10, 20],
[30, 40]
])
print(numbers.sum())実行結果は100です。
ただし、NumPyはPythonとは別にインストールするライブラリです。小さな2次元リストを合計するだけなら、標準のsum()で十分です。
まとめ
Pythonで2次元リスト全体を合計するには、sum()を2回使います。
total = sum(sum(row) for row in numbers)目的によって、次のように使い分けます。
- 全体の合計:
sum(sum(row) for row in numbers) - 行ごとの合計:
[sum(row) for row in numbers] - 列ごとの合計:
[sum(column) for column in zip(*numbers)]
2次元リストでは、外側のリストに入っているのが数値ではなくリストであることが重要です。内側のリストを先に処理する、と考えると仕組みを理解しやすくなります。

