【Python入門】listとsum()の使い方まとめ|合計の計算・初期値・応用例まで徹底解説!

python

「リストに入っている数字の合計を求めたい」
「for文で一つずつ足すのではなく、もっと簡単な方法はないかな?」

このような場面で非常に便利なのが、Pythonの組み込み関数sum()です。

sum()を使うと、リストやタプルなどの数値の集まりから、簡単に合計を求めることができます。

この記事では、sum()関数の基本的な使い方から、初期値の指定、エラー対策、応用例まで、初心者の方にもわかりやすく解説します。

スポンサーリンク

sum関数の基本的な使い方

数値リストの合計を求める

sum()関数を使うと、リストの中の数値をすべて足し合わせることができます。

numbers = [10, 20, 30, 40]
total = sum(numbers)
print(f"合計: {total}")

実行結果:

合計: 100

たった1行で合計が求められます。とても簡単ですね!

いろいろなリストで試してみる

# 整数のリスト
scores = [85, 92, 78, 88, 95]
print(f"テストの合計点: {sum(scores)}")

# 小数のリスト
prices = [120.5, 89.0, 245.8, 67.3]
print(f"商品の合計金額: {sum(prices)}")

# 負の数を含むリスト
temperatures = [-5, 3, -2, 8, 1]
print(f"温度の合計: {sum(temperatures)}")

実行結果:

テストの合計点: 438
商品の合計金額: 522.6
温度の合計: 5

for文と比較してみる

従来のfor文で合計を求める場合と比較してみましょう。

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

# for文を使った方法
total_for = 0
for num in numbers:
    total_for += num
print(f"for文での合計: {total_for}")

# sum()を使った方法
total_sum = sum(numbers)
print(f"sum()での合計: {total_sum}")

実行結果:

for文での合計: 15
sum()での合計: 15

結果は同じですが、sum()を使った方がコードが短く、読みやすくなります。

初期値(start)を指定する方法

初期値の基本的な使い方

sum()関数では、合計の開始値を指定することができます。

numbers = [1, 2, 3]

# 初期値なし(デフォルトは0)
print(f"初期値なし: {sum(numbers)}")

# 初期値を10に設定
print(f"初期値10: {sum(numbers, 10)}")

# 初期値を100に設定
print(f"初期値100: {sum(numbers, 100)}")

実行結果:

初期値なし: 6
初期値10: 16
初期値100: 106

初期値が役立つ場面

ボーナスポイントの計算

base_points = 50  # 基本ポイント
earned_points = [10, 15, 8, 12]  # 獲得ポイント

total_points = sum(earned_points, base_points)
print(f"総ポイント: {total_points}")

実行結果:

総ポイント: 95

前月の残高に今月の収支を加算

previous_balance = 50000  # 前月残高
transactions = [15000, -8000, 12000, -3000]  # 今月の収支

current_balance = sum(transactions, previous_balance)
print(f"今月の残高: {current_balance}円")

実行結果:

今月の残高: 66000円

sum関数が使えない場合とエラー対策

文字列が混在している場合

数値以外のデータが含まれていると、エラーが発生します。

mixed_data = [1, 2, "3", 4]
# total = sum(mixed_data)  # TypeError が発生

エラーメッセージ:

TypeError: unsupported operand type(s) for +: 'int' and 'str'

エラーを回避する方法1:型変換

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

# 文字列を数値に変換してから合計
safe_data = [int(x) if isinstance(x, str) and x.isdigit() else x for x in mixed_data]
total = sum(safe_data)
print(f"合計: {total}")

実行結果:

合計: 10

エラーを回避する方法2:数値のみをフィルタリング

mixed_data = [1, 2, "hello", 3, "world", 4]

# 数値のみを取り出して合計
numeric_only = [x for x in mixed_data if isinstance(x, (int, float))]
total = sum(numeric_only)
print(f"数値のみの合計: {total}")

実行結果:

数値のみの合計: 10

エラーを回避する方法3:try-except文

def safe_sum(data_list):
    """安全に合計を計算する関数"""
    total = 0
    for item in data_list:
        try:
            total += float(item)
        except (ValueError, TypeError):
            print(f"警告: {item} は数値ではないのでスキップします")
    return total

# 使用例
mixed_data = [1, 2, "3.5", "hello", 4]
result = safe_sum(mixed_data)
print(f"合計: {result}")

実行結果:

警告: hello は数値ではないのでスキップします
合計: 10.5

空のリストでの注意点

空のリストの合計

empty_list = []
total = sum(empty_list)
print(f"空のリストの合計: {total}")

# 初期値を指定した場合
total_with_start = sum(empty_list, 100)
print(f"初期値100での合計: {total_with_start}")

実行結果:

空のリストの合計: 0
初期値100での合計: 100

平均値計算での注意

空のリストで平均を計算するとゼロ除算エラーが発生します。

def safe_average(numbers):
    """安全に平均値を計算する関数"""
    if not numbers:  # リストが空の場合
        return 0
    return sum(numbers) / len(numbers)

# 使用例
scores1 = [80, 90, 85]
scores2 = []

print(f"平均点1: {safe_average(scores1)}")
print(f"平均点2: {safe_average(scores2)}")

実行結果:

平均点1: 85.0
平均点2: 0

二次元リスト(リストのリスト)の合計

二次元リストの全要素の合計

matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

# 方法1: 内包表記を使用
total1 = sum([sum(row) for row in matrix])
print(f"方法1の合計: {total1}")

# 方法2: ネストしたfor文
total2 = 0
for row in matrix:
    total2 += sum(row)
print(f"方法2の合計: {total2}")

# 方法3: flattened list
flattened = [num for row in matrix for num in row]
total3 = sum(flattened)
print(f"方法3の合計: {total3}")

実行結果:

方法1の合計: 45
方法2の合計: 45
方法3の合計: 45

各行の合計を求める

scores = [
    [85, 90, 78],  # 田中さんの点数
    [92, 88, 85],  # 佐藤さんの点数
    [76, 82, 90]   # 鈴木さんの点数
]

names = ["田中", "佐藤", "鈴木"]

for i, student_scores in enumerate(scores):
    total = sum(student_scores)
    average = total / len(student_scores)
    print(f"{names[i]}さん: 合計{total}点, 平均{average:.1f}点")

実行結果:

田中さん: 合計253点, 平均84.3点
佐藤さん: 合計265点, 平均88.3点
鈴木さん: 合計248点, 平均82.7点

条件付きで合計を求める

偶数のみの合計

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 偶数のみの合計
even_sum = sum([x for x in numbers if x % 2 == 0])
print(f"偶数の合計: {even_sum}")

# 奇数のみの合計
odd_sum = sum([x for x in numbers if x % 2 == 1])
print(f"奇数の合計: {odd_sum}")

実行結果:

偶数の合計: 30
奇数の合計: 25

特定の条件を満たす値の合計

# 商品の価格リスト
prices = [120, 89, 245, 67, 198, 334, 78]

# 100円以上の商品の合計金額
expensive_total = sum([price for price in prices if price >= 100])
print(f"100円以上の商品の合計: {expensive_total}円")

# 200円未満の商品の合計金額
cheap_total = sum([price for price in prices if price < 200])
print(f"200円未満の商品の合計: {cheap_total}円")

実行結果:

100円以上の商品の合計: 897円
200円未満の商品の合計: 552円

辞書のリストから特定の値を合計

students = [
    {"name": "田中", "math": 85, "english": 78},
    {"name": "佐藤", "math": 92, "english": 88},
    {"name": "鈴木", "math": 76, "english": 95}
]

# 数学の点数の合計
math_total = sum([student["math"] for student in students])
print(f"数学の合計点: {math_total}")

# 英語の点数の合計
english_total = sum([student["english"] for student in students])
print(f"英語の合計点: {english_total}")

# 各学生の合計点
for student in students:
    total = sum([student["math"], student["english"]])
    print(f"{student['name']}さんの合計: {total}点")

実行結果:

数学の合計点: 253
英語の合計点: 261
田中さんの合計: 163点
佐藤さんの合計: 180点
鈴木さんの合計: 171点

他のイテラブルでのsum関数

タプルでの使用

tuple_numbers = (1, 2, 3, 4, 5)
total = sum(tuple_numbers)
print(f"タプルの合計: {total}")

実行結果:

タプルの合計: 15

rangeでの使用

# 1から10までの合計
total = sum(range(1, 11))
print(f"1から10までの合計: {total}")

# 1から100までの偶数の合計
even_total = sum(range(2, 101, 2))
print(f"1から100までの偶数の合計: {even_total}")

実行結果:

1から10までの合計: 55
1から100までの偶数の合計: 2550

セットでの使用

number_set = {1, 2, 3, 4, 5}
total = sum(number_set)
print(f"セットの合計: {total}")

実行結果:

セットの合計: 15

実用的な活用例

家計簿の計算

# 月の支出データ
expenses = {
    "食費": [15000, 12000, 18000, 14000],
    "交通費": [3000, 2500, 3500, 2800],
    "娯楽費": [8000, 6000, 12000, 4000]
}

print("月別支出合計:")
for category, amounts in expenses.items():
    total = sum(amounts)
    average = total / len(amounts)
    print(f"{category}: 合計{total:,}円, 平均{average:,.0f}円")

# 全カテゴリの総合計
grand_total = sum([sum(amounts) for amounts in expenses.values()])
print(f"\n総支出: {grand_total:,}円")

実行結果:

月別支出合計:
食費: 合計59,000円, 平均14,750円
交通費: 合計11,800円, 平均2,950円
娯楽費: 合計30,000円, 平均7,500円

総支出: 100,800円

売上データの分析

# 各店舗の月間売上(万円)
sales_data = [
    [120, 135, 128, 142],  # 店舗A
    [89, 95, 102, 88],     # 店舗B
    [156, 168, 145, 171]   # 店舗C
]

store_names = ["店舗A", "店舗B", "店舗C"]

print("店舗別売上分析:")
for i, monthly_sales in enumerate(sales_data):
    total = sum(monthly_sales)
    average = total / len(monthly_sales)
    print(f"{store_names[i]}: 合計{total}万円, 月平均{average:.1f}万円")

# 全店舗の合計売上
total_sales = sum([sum(store) for store in sales_data])
print(f"\n全店舗合計売上: {total_sales}万円")

# 月別の合計売上
monthly_totals = []
for month in range(4):
    monthly_total = sum([store[month] for store in sales_data])
    monthly_totals.append(monthly_total)
    print(f"{month+1}月の全店舗売上: {monthly_total}万円")

よくある質問と解決方法

Q: 文字列の数字を自動で変換して合計したい

string_numbers = ["10", "20", "30", "40"]

# 文字列を数値に変換してから合計
total = sum([int(x) for x in string_numbers])
print(f"合計: {total}")

# より安全な方法(無効な文字列をスキップ)
def safe_string_sum(string_list):
    total = 0
    for item in string_list:
        try:
            total += float(item)
        except ValueError:
            print(f"警告: '{item}' は数値に変換できません")
    return total

mixed_strings = ["10", "20.5", "abc", "30"]
result = safe_string_sum(mixed_strings)
print(f"安全な合計: {result}")

Q: Noneが含まれているリストの合計

data_with_none = [10, None, 20, None, 30]

# Noneを除外して合計
total = sum([x for x in data_with_none if x is not None])
print(f"None除外後の合計: {total}")

# 0で置き換えて合計
total_with_zero = sum([x if x is not None else 0 for x in data_with_none])
print(f"Noneを0として計算: {total_with_zero}")

パフォーマンスの考慮

大きなリストでの処理

import time

# 大きなリストを作成
large_list = list(range(1000000))

# sum()の実行時間測定
start_time = time.time()
total_sum = sum(large_list)
end_time = time.time()

print(f"sum()の結果: {total_sum}")
print(f"実行時間: {end_time - start_time:.4f}秒")

# for文での実行時間測定(比較用)
start_time = time.time()
total_for = 0
for num in large_list:
    total_for += num
end_time = time.time()

print(f"for文の結果: {total_for}")
print(f"実行時間: {end_time - start_time:.4f}秒")

一般的に、sum()の方がfor文よりも高速に動作します。

まとめ

sum()関数は、Pythonでリストや他のイテラブルの数値を合計する際の基本的で重要な関数です。

重要なポイント

  • sum()は数値のイテラブルの合計を求める
  • 初期値を指定することで、任意の値から加算を開始できる
  • 数値以外が含まれているとエラーが発生する
  • 空のリストの合計は0になる

エラー対策

  • 型変換やフィルタリングで数値以外を除外
  • try-except文で安全な処理
  • 事前の型チェック

応用テクニック

用途方法
条件付き合計リスト内包表記との組み合わせ
二次元リストネストしたsum()の使用
平均値計算sum() / len()の組み合わせ
辞書から特定値キーを指定してリスト内包表記

使い分けの指針

  • 単純な合計 → sum()
  • 条件付き合計 → sum() + リスト内包表記
  • 複雑な処理 → for文やその他の方法

コメント

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