Python | データ構造:sum

Python
スポンサーリンク

概要(sum は「合計」を返す基本関数)

sum は、リスト・タプル・集合・range など“足し算できる要素の集まり”から合計を求める組み込み関数です。数値はもちろん、True/False(1/0として扱われる)も合計できます。書き方は sum(イテラブル, start=0) で、start は初期値(省略時 0)です。

print(sum([10, 20, 30]))     # 60
print(sum(range(5)))         # 10(0+1+2+3+4)
print(sum([True, False, True]))  # 2(True=1, False=0)
Python

基本構文と引数(ここが重要)

イテラブル+初期値(start)

sum(iterable, start=0) の形で使います。まず start が初期値として置かれ、イテラブルの各要素が順に加算されます。合計に固定費や初期残高などを足したいときに便利です。

prices = [100, 250, 150]
print(sum(prices, 500))  # 1000(初期値500を加えた合計)
Python

数値以外が混在するとエラーになる

足し算できない型(文字列や None 等)が混ざると TypeError になります。合計前に型をそろえるか、フィルタリングして安全に扱いましょう。

data = [10, "20", None, 5]
safe_total = sum(int(x) for x in data if str(x).isdigit())
print(safe_total)  # 35
Python

データ型ごとの挙動(数値・ブール・辞書・集合)

数値(int/float)の合計

最も基本的な使い方です。平均値計算に直結します。

scores = [80, 70, 90]
avg = sum(scores) / len(scores)
print(avg)  # 80.0
Python

ブール値は 1/0 として足せる

条件を満たした件数のカウントに使えます。

nums = [1, 5, 10, 0]
count_pos = sum(n > 0 for n in nums)  # True/False の合計
print(count_pos)  # 3
Python

辞書は values を合計する

辞書の値だけを合計するのが定番です。

prices = {"coffee": 350, "tea": 280, "juice": 220}
print(sum(prices.values()))  # 850
Python

集合・range もそのまま合計可能

重複無しの合計や、範囲の合計に向いています。

print(sum({1, 2, 3}))     # 6
print(sum(range(1, 101))) # 5050
Python

応用とテクニック(ここを押さえると一気に使える)

条件付き合計(フィルタ+内包表記)

合計したい条件をシンプルに書けます。

nums = [10, -5, 30, -2]
print(sum(n for n in nums if n >= 0))  # 40(非負のみ合計)
Python

二次元の合計(行・全体)

行ごとも全体も一行で書けます。

matrix = [[1, 2, 3], [4, 5, 6]]
print([sum(row) for row in matrix])  # [6, 15]
print(sum(sum(row) for row in matrix))  # 21
Python

重み付き合計(加重平均の基礎)

重み w を掛けてから合計します。

scores = [80, 70, 90]
weights = [0.2, 0.3, 0.5]
weighted = sum(s*w for s, w in zip(scores, weights))
print(round(weighted, 2))  # 83.5
Python

正確な小数の合計には Decimal/Fraction

浮動小数の丸め誤差を避けたい場合は標準ライブラリを使います。

from decimal import Decimal
prices = [Decimal("0.1"), Decimal("0.2"), Decimal("0.3")]
print(sum(prices))  # Decimal('0.6')
Python

重要ポイントの深掘り(性能・精度・非数値の扱い)

計算量と速度

sum は要素数に比例して O(n) ですが、C 実装で高速です。大規模データでも安心して使えます。重い変換を伴う場合は、内包表記で“1回のパスで変換+合計”にまとめると効率的です。

# 変換+フィルタ+合計を一度に
logs = ["10", "x", "25", "7"]
print(sum(int(s) for s in logs if s.isdigit()))  # 42
Python

浮動小数点の誤差

float は丸め誤差があり、期待と微妙にズレることがあります。合計が金額や正確な比率に関わるなら Decimal/Fraction を検討しましょう。

print(0.1 + 0.2)  # 0.30000000000000004(典型的な誤差)
Python

文字列やリストの “合計” は目的に応じて別手段

  • 文字列結合は ” “.join(strings) を使うのが定石です(sum は遅くて不適切)。
  • リスト結合は itertools.chain が推奨。sum(lists, []) も動きますが計算量とコピーで非推奨です。
# 文字列結合
parts = ["Hello", "world"]
print(" ".join(parts))  # "Hello world"

# リスト結合
import itertools
lists = [[1,2], [3], [4,5]]
print(list(itertools.chain.from_iterable(lists)))  # [1,2,3,4,5]
Python

例題で身につける(定番から一歩先まで)

例題1:平均と合計(シンプル版)

nums = [12, 15, 9]
total = sum(nums)
avg = total / len(nums)
print(total, avg)  # 36 12.0
Python

例題2:辞書のリストからフィールド合計

orders = [
    {"item": "coffee", "qty": 2, "price": 350},
    {"item": "tea",    "qty": 1, "price": 280},
]
revenue = sum(o["qty"] * o["price"] for o in orders)
print(revenue)  # 980
Python

例題3:Bool で件数を数える

users = ["ok", "ng", "ok", "ok"]
ok_count = sum(s == "ok" for s in users)
print(ok_count)  # 3
Python

例題4:欠損・文字混在の安全な合計

data = [10, "20", None, "x", 5]
def to_int_safe(x):
    try:
        return int(x)
    except (TypeError, ValueError):
        return 0

print(sum(to_int_safe(x) for x in data))  # 35
Python

まとめ

sum は「合計」を最短で計算できる基本関数です。start で初期値を足せる、条件付き合計は内包表記が簡潔、ブール合計で件数カウントもできる、辞書の values や二次元の合計も直感的に書ける。精度が重要なら Decimal を選び、文字列やリストの“結合”は join/chain を使う。型混在は事前整形で避ける——これらを押さえれば、初心者でも安全・高速・可読な集計コードが書けます。

タイトルとURLをコピーしました