・IT/Web系エンジニアの経験者の方
・どこの転職エージェントを利用しようか迷っている方
それなら、キッカケエージェントにご相談!
キッカケエージェントでは、少数精鋭のエージェントが、エンジニアの経験やスキル、志向性などをカウンセリングし、的確なアドバイスを提供します!
また、徹底した企業へのヒアリングにより、最適なマッチングを実現し、今では内定率が一般的なエージェントの2倍以上となっています!
転職エージェントに迷っている方、まずは無料でキャリア相談から!
(この記事は2024年01月08日に投稿されました。)
Pythonでリスト(List)の合計値を求めるにはsum()を使用します。
sum()とは集合型のデータ構造(イテレータ)に格納された要素の合計値を求めることができる関数になります。
そのため、複数の値が格納されたリスト内の数値を計算し合計した結果を返すようになります。
また、sum()は1次元リストだけでなく2次元リストや3次元リストなどのような多次元リストやタプルなどの他のイテレータの合計値を求めることも可能です。
しかし、文字を含むリストではエラーが発生したり、小数の計算で場合によっては桁落ちが発生しまったりするため注意して使用しましょう。
今回はPythonのsum()でリスト(List)の合計値を求める方法について紹介していきます。
リスト(List)内の要素の合計値を求めたい場合
sum()とは
sum()とは、集合型のデータ構造(イテレータ)に格納された要素の合計値を求めることができる関数になります。
そのため、リストに格納されている要素の合計値を求めることが可能になります。
sum()の書き方
sumの書き方は下記のようになります。
1 | sum('イテレータ' [,追加する値]) |
sum()の括弧に必須のパラメータを指定することで使用できます。
また、任意なパラメータを追加して指定することでも使用可能です。
sum()のパラメータ
sum()のパラメータは下記のようになります。
- イテレータ:(必須)
合計値を求めたいイテレータ(リストなど)を指定する - 追加する値:(任意)
加算して合計値を求めたい数値を指定する
sum()は必須なパラメータとして「イテレータ」を指定し、任意なパラメータとして「追加する値」を指定します。
そのため、最大で2つのパラメータを指定して使用します。
sum()の返り値
sum()の返り値はイテレータ内の合計された値となります。
sum()でリスト(List)の合計値を求めるサンプルコード
sum()でリストの合計値を求めるサンプルコードをご紹介します。
ここでは、下記の3パターンでsum()を使用します。
- リスト(List)内に要素が存在する場合
- リスト(List)内に要素が存在しない場合
- リスト(List)内の要素が文字である場合
リスト(List)内に要素が存在する場合
リスト(List)内に値が存在する場合にsum()を使用するとリストに格納された数値の合計値が返されます。
● main.py
1 2 3 4 5 6 7 | print('● 対象のリスト') list = [145, 346, 678, 908, 258, 908, 2] print(list) print("● sum()使用後") list_sum = sum(list) print(list_sum) |
実行結果
リスト(List)内に要素が存在する場合にsum()で合計値を求めています。
そのため、リスト内の数値を足した結果の「3245」が表示されています。
リスト(List)内に要素が存在しない場合
リスト(List)内に値が存在しない場合にsum()を使用すると「0」が返されます。
● main.py
1 2 3 4 5 6 7 | print('● 対象のリスト') list = [] ptint(list1) print("● sum()使用後") list_sum = sum(list) print(list_sum) |
実行結果
リスト(List)内に要素が存在しない場合にsum()で合計値を求めています。
今回はリストの中が空であるため、「0」が表示されています。
リスト(List)内の要素が文字である場合
リスト(List)内の要素が文字である場合にsum()を使用するとエラーが発生します。
● main.py
1 2 3 4 5 6 7 | print('● 対象のリスト') list1 = ['python', 'JavaScript', 'PHP'] print(list1) print("● sum()使用後") list1_sum = sum(list1) print(list1_sum) |
実行結果
リスト(List)内の要素が文字である場合にsum()で合計値を求めています。
リストの中が文字であり、計算できないことからエラーログが表示されています。
数値を加算してsum()でリスト(Lsit)の合計値を求める場合
数値を加算してsum()でリスト(Lsit)の合計値を求めるにはパラメータに追加する値を指定します。
追加する値を指定することで、「リスト内の数値 + 追加する値」の合計値を求めることができます。
● main.py
1 2 3 4 5 6 7 | print('● 対象のリスト') list1 = [145, 346, 678, 908, 258, 908, 2] print(list1) print("● sum()使用後") list1_sum = sum(list1, 100000) print(list1_sum) |
実行結果
sum()で数値を加算してリスト(List)の合計値を求めています。
そのため、リスト内の数値の合計とパラメータの「100000」を足した結果の「103245」が表示されています。
sum()で多次元配列リスト(List)の合計値を求めるサンプルコード
sum()で多次元配列リスト(List)の合計値を求めるサンプルコードをご紹介します。
2次元リスト(List)の場合
2次元リスト(List)に対してsum()を使用します。
● main.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | print('● 対象の2次元リスト') list1 = [ [1.11, 2.22, 3.33, 4.44, 5.55], [10, 20, 30, 40, 50], [100, 200, 300, 400, 500], [1000, 2000, 3000, 4000, 5000] ] print(list1) print('● sum()使用後(1次元リストの各合計)') for list1_n in list1: list1_n_sum = sum(list1_n) print(list1_n_sum) print('● sum()使用後(2次元リストの合計)') list1_val_sum = 0 for list_val in map(sum, list1): list1_val_sum = list1_val_sum + list_val print(list1_val_sum) |
実行結果
sum()で2次元リスト(List)の合計値を求めています。
そのため、1次元リストの各合計である「16.650000000000002」、「150」、「1500」、「15000」が表示されています。
また、2次元リストの合計値である「16666.65」が表示されています。
3次元リスト(List)の場合
3次元リスト(List)に対してsum()を使用します。
● main.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | print('● 対象の3次元リスト') list1 = [ [[10.90, 20.46, 30.8, 40.8, 50.09],[100, 200, 300, 400, 500]], [[1000, 2000, 3000,4000, 5000],[10000, 20000, 30000, 40000, 50000]] ] print(list1) print('● sum()使用後(1次元リストの各合計)') for list1_n in list1: for list1_nm in list1_n: list1_nm_sum = sum(list1_nm) print(list1_nm_sum) print('● sum()使用後(2次元リストの各合計)') for list1_n in list1: list1_n_sum = 0 for list1Val in list1_n: list1_sum = sum(list1Val) list1_n_sum = list1_n_sum + list1_sum print(list1_n_sum) print('● sum()使用後(3次元リストの合計)') list1_val_num = 0 for i in range(len(list1)): for list1_val in map(sum, list1[i]): list1_val_num = list1_val_num + list1_val print(list1_val_num) |
実行結果
sum()で3次元リスト(List)の合計値を求めています。
そのため、1次元リストの各合計値である「153.05」、「1500」、「15000」、「15000」が表示されています。
また、2次元リストの各合計値である「1653.05」、「165000」が表示されています。
そして、3次元リストの合計値である「166653.05」が表示されています。
sum()を使用する際の注意点
先ほどまでsum()でリストの合計値を求めてきましたが、使用する際に注意すべき点があります。
そのため、ここではsum()を使用する際の注意点についてご紹介します。
- 文字列型の値が含まれると合計値の計算ができない
- 小数の合計値に誤差が生じてしまう
文字列型の値が含まれると合計値の計算ができない
まず1つ目は、リストの値に文字列型の値が含まれると合計値の計算ができないということです。
sum()は合計値を求める関数のため、数値型のみが格納されたイテレータが対象となります。
そのため、文字列型と数値型が混合したリストに対してsum()を使用するとエラーが発生してしまいます。
● main.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | print('● 対象のリスト-1') list1 = [145, 346, 'Python', 908, 'Java', 908, 2] print(list1) print("● sum()使用後-1") list1_sum = sum(list1) print(list1_sum) print('● 対象のリスト-2') list2 = [145, 346, '678', 908, 258, '908', 2] print(list2) print("● sum()使用後-2") list2_sum = sum(list2) print(list2_sum) |
実行結果
リスト内に「Python」や「Java」など計算できない値が存在するため、sum()を使用してもエラーが発生します。
また、文字列型の数値が格納されていても計算できないことからエラーが発生しています。
もし、文字列型の数値が格納されたイテレータに対して合計値を求めたい場合には、内包表記やフィルタリングで抽出してsum()を使用すると良いですよ。
小数の合計値に誤差が生じてしまう
そして2つ目は、小数の合計値に誤差が生じてしまうということです。
sum()は整数の場合は正確に合計値を求めることができますが、小数の合計値を求めると場合によって桁落ちが生じてしまいます。
● main.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | print('● 対象のリスト-1') list1 = [0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01] print(list1) print("● sum()使用後-1") list1_sum = sum(list1) print(list1_sum) print('● 対象のリスト-2') list2 = [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] print(list2) print("● sum()使用後-2") list2_sum = sum(list2) print(list2_sum) |
実行結果
sum()で「0.01」が10個格納されているリストの合計値を求めていますが、「0.1」ではなく「0.09999999999999999」となっています。
また、sum()で「0.1」が10個格納されているリストの合計値を求めていますが、「1.0」ではなく「0.9999999999999999」となっています。
つまり、sum()を使用すると場合によっては桁が上がることなく桁落ちが発生してしまいます。
sum()を使用した実際のケース
sum()を使用した実際のケースについてご紹介します。
例えば、sum()を使用して入力した値を足し算し、合計した結果を画面に表示するようなコードを作成します。
● index.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <!DOCTYPE html> <html lang="ja"> <head> <title>sum()でリスト(List)の合計値を求める</title> <meta charset="utf-8"/> </head> <body> <h1>数値を入力</h1> <form action="/result" method="POST"> <p>入力値-1</p> <input name="inp1"> <p>+</p> <p>入力値-2</p> <input name="inp2"> <p>+</p> <p>入力値-3</p> <input name="inp3"> <button type="submit">送信</button> </form> </body> </html> |
● result.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <!DOCTYPE html> <html lang="ja"> <head> <title>sum()でリスト(List)の合計値を求める</title> <meta charset="utf-8"/> </head> <body> <h1>入力した合計値の結果</h1> <p style="font-weight: bold; font-size: 20px;">合計値: {{ result }}</p> <h2>入力した値</h2> <ul> <li>入力値-1: {{ input1_log }}</li> <li>入力値-2: {{ input2_log }}</li> <li>入力値-3: {{ input3_log }}</li> </ul> </body> </html> |
● app.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | from flask import Flask, render_template, request app = Flask(__name__) @app.route('/') def index(): return render_template('index.html') @app.route('/result', methods=['POST']) def result(): input1 = '' input2 = '' input3 = '' input_sum = 0 input_arr = [] input1 = request.form.get('inp1') input2 = request.form.get('inp2') input3 = request.form.get('inp3') input_arr.append(int(input1)) input_arr.append(int(input2)) input_arr.append(int(input3)) input_sum = sum(input_arr) return render_template('result.html', result = input_sum, input1_log = input1, input2_log = input2, input3_log = input3) if __name__ == '__main__': app.run() |
実行結果
sum()で入力した値を足し算し、合計した結果を表示しています。
そのため、「送信」ボタンを押すと画面が遷移して入力した数値の合計値が表示されています。
sum()でリスト(List)以外の合計値を求める場合
sum()はリストだけでなく他のイテレータの合計値を求めることも可能です。
そのため、ここではsum()でリスト以外の合計値を求めます。
タプル型の場合
タプル型に対してsum()を使用します。
● main.py
1 2 3 4 5 6 7 | print('● 対象のタプル') tuple1 = (145, 346, 908, 567, 43, 908, 2) ptint(tuple1) print("● sum()使用後") tuple1_sum = sum(tuple1) print(tuple1_sum) |
実行結果
sum()でタプルの合計値を求めています。
そのため、タプルの数値を足した結果である「2919」が表示されています。
辞書型の場合
辞書型に対してsum()を使用します。
● main.py
1 2 3 4 5 6 7 8 9 10 11 | print('● 対象の辞書') dict1 = {1: 116, 2: 1453, 3: 245, 4: 999, 5: 89845, 6: 2000, 7: 3400, 10: 19665} print(dict1) print("● sum()使用後(キー)") dict1_sum = sum(dict1.keys()) print(dict1_sum) print("● sum()使用後(値)") dict1_sum = sum(dict1.values()) print(dict1_sum) |
実行結果
sum()で辞書型の合計値を求めています。
そのため、辞書型のキーの数値を足した結果である「38」が表示されています。
また、辞書型の値の数値を足した結果である「117723」が表示されています。
set型の場合
set型に対してsum()を使用します。
● main.py
1 2 3 4 5 6 7 | print('● 対象のset') set1 = {33, 23, 4, 9000, 150, 22345, 9876, 1259} print(set1) print("● sum()使用後") set1_sum = sum(set1) print(set1_sum) |
実行結果
sum()でset型の合計値を求めています。
そのため、set型の数値を足した結果である「42690」が表示されています。
リスト(List)の合計値を求める他の方法
Pythonではsum()以外にもリスト(List)の合計値を求める方法が存在します。
そのため、ここではリスト(List)の合計値を求める他の方法についてご紹介します。
math.fsum()
math.fsum()とはmathモジュールで準備されている数値の合計を求める関数になります。
そもそもmathモジュールとは、数学的な計算をするのに役立つ標準モジュールとなります。
こちらの関数を使用することで桁上がりの際に発生する桁落ちの誤差を防ぐことができます。
● main.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import math print('● 対象のリスト-1') list1 = [14.507, 340.8, 670, 90.799, 250, 900, 25.6] print(list1) print("● math.fsum()使用後-1") list1_sum = math.fsum(list1) print(list1_sum) print('● 対象のリスト-2') list2 = [0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01] print(list2) print("● math.fsum()使用後-2") list2_sum = math.fsum(list2) print(list2_sum) |
実行結果
math.fsum()でリスト(List)の合計値を求めています。
そのため、リスト内の数値を足した結果である「2291.706」と「0.1」が表示されています。
np.sum()
np.sum()とはNumPyの中にある要素の合計値を求める関数になります。
そもそもNumPyとは数値の計算を効率的に行うためのPythonの拡張モジュールとなります。
そのため、NumPyをインポートしsum()を使用することでリストの合計値を求めることができます。
● main.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import numpy as np print('● 対象のリスト-1') list1 = [140, 340, 670, 900, 250, 900, 20] print(list1) print("● np.sum()使用後-1") list1_sum = np.sum(list1) print(list1_sum) print('● 対象のリスト-2') list2 = [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] print(list2) print("● np.sum()使用後-2") list2_sum = np.sum(list2) print(list2_sum) |
実行結果
np.sum()でリスト(List)の合計値を求めています。
そのため、リスト内の数値を足した結果である「3220」と「1.0」が表示されています。
まとめ
⚫︎ sum()とは、集合型のデータ構造(イテレータ)に格納された要素の合計値を求めることができる関数である。
⚫︎ sum()は下記の引数を指定して使用する。
・イテレータ:(必須)
・追加する値:(任意)
⚫︎ リスト(List)内に値が存在する場合にsum()を使用すると、リストに格納された数値の合計値を返す。
⚫︎ リスト(List)内に値が存在しない場合にsum()を使用するとエラーが発生する。
⚫︎ sum()は1次元リスト(List)だけでなく、多次元配列リスト(List)の合計値を求めることもできる。
⚫︎ sum()で数値を加算してリスト(List)の合計値を求めるにはパラメータに「追加する値」を指定する。
⚫︎ sum()を使用する際には下記の点に注意する。
・文字列型の値が含まれると合計値の計算ができない
(文字列型の要素が混合するとエラーが発生する)
・小数の合計値に誤差が生じてしまう
(桁落ちが発生してしまう)
⚫︎ sum()はリストだけでなくタプルや辞書、setなどの他のイテレータの合計値を求めることができる。
⚫︎ リスト(List)の合計値を求める関数はsum()以外にも下記の関数がある。
・math.fsum()
(mathモジュールで準備されているsum()関数)
・np.sum()
(Numpyモジュールで準備されているsum()関数)