概要(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 を使う。型混在は事前整形で避ける——これらを押さえれば、初心者でも安全・高速・可読な集計コードが書けます。
