MENU

Pythonで2次元リストの数値を合計する方法|sum()の使い方と注意点

Pythonの「sum()」は、リストに入っている数値を合計するときに使う関数です。

通常のリストだけでなく、リストの中に複数のリストが入った「2次元リスト」の集計にも利用できます。ただし、2次元リストをそのまま「sum()」に渡すだけでは計算できません。

この記事では、2次元リストの数値を合計する方法と、「sum()」の仕組みを初心者向けに解説します。

目次

sum()の基本的な使い方

最初に、通常のリストを合計してみましょう。

# 数値のリスト
numbers = [1, 2, 3, 4, 5]

# リスト内の数値を合計
total = sum(numbers)

print(total)  # 15

「sum()」に数値のリストを渡すと、すべての要素を足した結果が返されます。

「sum()」には、合計に加える初期値も指定できます。

# 数値のリスト
numbers = [1, 2, 3, 4, 5]

# 6から加算を始める
total = sum(numbers, 6)

print(total)  # 21

第2引数の「6」が初期値です。そのため、計算は次のようになります。

6 + 1 + 2 + 3 + 4 + 5 = 21

第2引数を省略した場合、初期値は「0」になります。

2次元リストはそのまま合計できない

2次元リストとは、リストの中にさらにリストが入っているデータです。

numbers = [
    [1, 2],
    [3, 4],
    [5, 6]
]

外側のリストに直接入っているのは数値ではなく、「[1, 2]」などのリストです。

そのため、次のコードはエラーになります。

numbers = [
    [1, 2],
    [3, 4],
    [5, 6]
]

# リストと数値は加算できないためエラーになる
total = sum(numbers)

通常の「sum()」「0」を初期値として計算します。しかし、数値の「0」とリストの「[1, 2]」は加算できません。

2次元リストでは、内側のリストから先に合計する必要があります。

sum()を2段階で使う

2次元リスト内の数値をすべて合計する場合は、内側と外側で「sum()」を使います。

# 2次元リスト
numbers = [
    [1, 2],
    [3, 4],
    [5, 6]
]

# 各行を合計してから、全体を合計
total = sum(sum(row) for row in numbers)

print(total)  # 21

この処理では、最初に「sum(row)」が各行を合計します。

[1, 2] → 3
[3, 4] → 7
[5, 6] → 11

次に、外側の「sum()」「3」「7」「11」を合計します。

3 + 7 + 11 = 21

コードを内側から読むと、処理の流れを理解しやすくなります。

total = sum(sum(row) for row in numbers)

この書き方は、合計するためだけに新しいリストを作る必要がないため、短く効率的です。

for文で書くと仕組みが分かりやすい

先ほどの処理は、for文を使って書くこともできます。

# 2次元リスト
numbers = [
    [1, 2],
    [3, 4],
    [5, 6]
]

# 合計を保存する変数
total = 0

# 内側のリストを順番に取り出す
for row in numbers:
    # 1行分の合計を加算
    total += sum(row)

print(total)  # 21

「row」には、内側のリストが一つずつ入ります。

初心者のうちは、短いコードだけを覚えるのではなく、for文で「各行を合計し、その結果を全体に加える」という流れを確認しておくとよいでしょう。

sum(nums, [])でリストを結合する方法

「sum()」の初期値に空のリストを指定すると、2次元リストを一つのリストに結合することもできます。

# 2次元リスト
numbers = [
    [1, 2],
    [3, 4],
    [5, 6]
]

# 空のリストを初期値にして結合
flat_numbers = sum(numbers, [])

print(flat_numbers)  # [1, 2, 3, 4, 5, 6]

この場合は数値の加算ではなく、次のようにリスト同士が順番に結合されます。

[] + [1, 2] + [3, 4] + [5, 6]

初期値を「[0]」にすると、結果の先頭に「0」が入ります。

numbers = [
    [1, 2],
    [3, 4],
    [5, 6]
]

flat_numbers = sum(numbers, [0])

print(flat_numbers)  # [0, 1, 2, 3, 4, 5, 6]

「sum()」の初期値が、計算の開始地点として使われていることが分かります。

リストを結合してから合計する方法

先に2次元リストを結合し、その結果をもう一度「sum()」に渡しても、数値の合計を求められます。

numbers = [
    [1, 2],
    [3, 4],
    [5, 6]
]

# リストを結合してから数値を合計
total = sum(sum(numbers, []))

print(total)  # 21

このコードでも正しい結果になります。

ただし、合計だけが目的であれば、次の書き方がおすすめです。

total = sum(sum(row) for row in numbers)

「sum(numbers, [])」は、リストを結合するたびに新しいリストを作ります。データが多くなると、余分な処理が増えてしまいます。

「一度リストを平らにしてから合計する」のではなく、「各行の合計を直接足す」と考えたほうが、処理の目的も分かりやすくなります。

「sum(numbers, [])」は、「sum()」の初期値の仕組みを理解する例としては面白いものの、リストを結合する標準的な方法として多用するのは避けたほうがよいでしょう。

行ごとの合計を求める場合

全体の合計ではなく、行ごとの合計が欲しい場合は、リスト内包表記を使えます。

# 2次元リスト
numbers = [
    [1, 2],
    [3, 4],
    [5, 6]
]

# 行ごとの合計をリストにする
row_totals = [sum(row) for row in numbers]

print(row_totals)  # [3, 7, 11]

全体を一つの数値にする場合と、行ごとの結果を残す場合では、必要なコードが異なります。

計算する前に「どの単位で結果が欲しいのか」を考えることが、データ処理では重要です。

空のリストや文字列に注意する

内側に空のリストが含まれていても、「sum([])」「0」になるため、そのまま計算できます。

numbers = [
    [1, 2],
    [],
    [3, 4]
]

total = sum(sum(row) for row in numbers)

print(total)  # 10

一方、リスト内に文字列が含まれているとエラーになります。

numbers = [
    [1, 2],
    [3, "4"]
]

引用符で囲まれた「”4″」は、数値ではなく文字列です。外部から読み込んだデータを合計するときは、要素が数値になっているか確認しましょう。

まとめ

Pythonで2次元リストの数値を合計する場合は、「sum()」を内側と外側で使います。

total = sum(sum(row) for row in numbers)

処理の仕組みを確認したい場合は、for文でも書けます。

total = 0

for row in numbers:
    total += sum(row)

「sum(numbers, [])」を使って2次元リストを結合することもできますが、合計だけが目的なら、各行を直接合計する方法が適しています。

「sum()」は単に数値を足すだけの関数ではありません。初期値から要素を順番に加えていく仕組みを理解すると、2次元リストを扱う方法も自然に考えられるようになります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次