Pythonリストの最大値・合計・平均・並べ替えまとめ
「数値のリストから最大値や合計を出したいけれど、毎回for文を書くのは面倒」「平均や並べ替えはどう書けばいいのか」。Pythonでデータを扱い始めると、こうした場面にすぐ出会います。
数値リストの集計には、便利な組み込み関数が揃っています。組み込み関数とは、Pythonに最初から用意されていて、importなしで使える関数のことです。for文を書かなくても、1行で結果を取り出せます。この記事では、次の内容を順に紹介します。
- 最大値・最小値・合計値の取得
- 要素の数と平均値の計算
- 並べ替えと上位・下位の取り出し
- 四捨五入
- 空のリストで起きるエラーの対処
リストから最大値・最小値を取得する
最大値はmax()、最小値はmin()にリストを渡すだけで取得できます。
list1 = [1,2,3,4,5,6,7,8,9,10]
max_value = max(list1)
print(max_value) # 10
min_value = min(list1)
print(min_value) # 1
リストの合計値を取得する
合計値はsum()で求められます。
list1 = [1,2,3,4,5,6,7,8,9,10]
sum_value = sum(list1)
print(sum_value) # 55
要素の数と平均値を求める
要素の数はlen()で分かります。
list1 = [1,2,3,4,5,6,7,8,9,10]
print(len(list1)) # 10
平均値を求める専用の組み込み関数はありません。合計を要素の数で割って求めます。
list1 = [1,2,3,4,5,6,7,8,9,10]
nums = [5,3,8,1,9,2]
print(sum(list1) / len(list1)) # 5.5
print(sum(nums) / len(nums)) # 4.666666666666667
標準ライブラリのstatistics.mean(list1)でも同じ5.5が得られます。ただし、これは組み込み関数ではなく標準ライブラリなので、import statisticsが必要です。
リストを並べ替える
並べ替えにはsorted()を使います。元のリストは変更せず、並べ替えた新しいリストを返します。
nums = [5,3,8,1,9,2]
print(sorted(nums)) # [1, 2, 3, 5, 8, 9]
print(sorted(nums, reverse=True)) # [9, 8, 5, 3, 2, 1]
print(nums) # [5, 3, 8, 1, 9, 2]
reverse=Trueを付けると降順になります。numsは並べ替え前のまま残っています。
「点数の上位3件だけ欲しい」ときは、並べ替えた結果をスライス[:3]で先頭から3件切り出します。
nums = [5,3,8,1,9,2]
print(sorted(nums, reverse=True)[:3]) # [9, 8, 5]
print(sorted(nums)[:3]) # [1, 2, 3]
降順の先頭3件が上位3件、昇順の先頭3件が下位3件です。
似たものにリストのメソッドnums.sort()があります。こちらは元のリストを直接書き換え、戻り値はNoneです。元のデータを残したいときはsorted()を選んでください。sorted(nums)のつもりでresult = nums.sort()と書くと、resultがNoneになってしまいます。
小数を四捨五入する
平均値は小数になることが多く、そのままだと桁が長くなります。四捨五入にはround()を使います。第2引数で小数点以下の桁数を指定できます。
list1 = [1,2,3,4,5,6,7,8,9,10]
print(round(3.14159, 2)) # 3.14
print(round(sum(list1) / len(list1))) # 6
桁数を省略すると整数に丸めます。平均の5.5は6になります。
注意したいのは、Pythonのround()が「ちょうど .5」のとき偶数に丸める仕様(銀行家丸め)である点です。学校で習う四捨五入と結果が違う場合があります。
print(round(2.5)) # 2
print(round(3.5)) # 4
2.5は3ではなく2になります。常に「5なら切り上げ」にしたい場面では、この仕様を頭に入れておいてください。
空のリストで起きるエラーと対処
データが0件のときに、関数ごとに動きが違うので注意が必要です。
max([])・min([]):ValueError: max() iterable argument is emptyが発生(minも同様のエラー)sum([]):エラーにならず0を返すsum([]) / len([]):ZeroDivisionError: division by zeroが発生
平均値の計算でZeroDivisionErrorが出るのは、len()が0になり、0で割ってしまうためです。平均を求める前に、要素が1個以上あるか確認してください。
max()とmin()は、default=を指定するとエラーを避けられます。空のリストのときは、指定した値を返します。
empty = []
print(sum(empty)) # 0
print(len(empty)) # 0
print(max(empty, default=0)) # 0
まとめ
| やりたいこと | 使うもの |
|---|---|
| 最大値・最小値 | max()・min() |
| 合計値 | sum() |
| 要素の数 | len() |
| 平均値 | sum() / len() |
| 並べ替え(元のリストは残す) | sorted() |
| 四捨五入 | round() |
- 平均を求める専用の組み込み関数はなく、
sum() / len()で計算する sorted()は新しいリストを返し、nums.sort()は元のリストを書き換えるround()は偶数に丸める仕様のため、一般的な四捨五入とずれる場合がある- 要素が0個のときは、
max()・min()のValueErrorと、平均のZeroDivisionErrorに注意する
