[アルゴリズム×Python]   基本統計量の計算(合計値、最大値、最小値)

アルゴリズムとPythonについて書いていきます。
今回は簡単な計算を関数を使って求めるだけでなく、関数を使わない場合どうやって求めるかについても書いていきます。

#目次

0.算術演算子と比較演算子の確認
1.リスト内包表記について
2.合計値を求める
3.最大値を求める
4.最小値を求める
最後に



#0.算術演算子と比較演算子の確認

##算術演算子

◯計算を行うための記号についてです。

| 演算子 |意味 | 例    |結果|
|:-----:|:---:|:--------:|:--------:|
| +          |  足し算 | 3 + 4        |7|
| -          |  引き算 |    10 - 2   |8|
| *          |  かけ算 | 5 * -6        |-30|
| /          |  浮動小数点数の割り算 |  5 / 2   |2.5|
| //          |  整数の割り算 | 5 // 2        |2|
| %          | 割り算のあまり | 7 % 2   |1|
| **         | ~乗(指数) | 2 ** 4   |16|

##比較演算子

◯比較を行うための記号についてです。
TrueかFalseのブール値を返します。

| 意味 |演算子 | 
|:-----:|:---:|
| 等しい         | == | 
| 等しくない         | != | 
| より小さい         | < | 
| 以下         | <= | 
| より大きい         | > | 
| 等しくない         | >= | 
| 要素になっている         | in ~  | 




#リスト内包表記について

◯様々な種類のリストを効率的につくるために、リスト内包表記が使われます。
今回の記事でも色々なリストを使って行きたいと思うので、事前に書いていきます。


##リスト内包表記とは

リストをつくる方法の1つです。
**[リストに格納する要素 for 要素 in イテラブルオブジェクト]**という形で定義します。
**リストに格納する要素**は、要素を使用した**式**です。
**イテラブルオブジェクト**は、要素を1つずつ取り出すことのできるオブジェクトのことです。

##リスト内包表記の使用例

◯range()関数はイテラブルオブジェクトを返します。

```ex0.py
#1以上10未満の整数を1つずつ取り出して、その値をnumbersリストに格納する
numbers = [number for number in range(1,10)]
print(numbers)
```

```.py
[1, 2, 3, 4, 5, 6, 7, 8, 9]
```

```ex1.py
#1以上10未満の整数を1つずつ取り出して、それに2をかけた値をnumbersリストに格納する
numbers = [number * 2 for number in range(1,10)]
print(numbers)
```

```.py
[2, 4, 6, 8, 10, 12, 14, 16, 18]
```

```ex2.py
#1以上10未満の整数を1つずつ取り出して、偶数の値のみをnumbersリストに格納していく
numbers = [number for number in range(1,10) if number % 2 == 0]
print(numbers)
```

```.py
[2, 4, 6, 8]
```


```ex3.py
#文字列のリスト
list_1 = ['1','2','3']
#文字列のリストlist_1から要素を1つずつ取り出して、整数にしてからリストnumbersに格納する
numbers = [int(i) for i in list_1]
print(numbers)
```

```.py
[1, 2, 3]
```


```ex4.py
#取り出した要素が奇数ならばそのまま格納して偶数ならば2乗してから格納する
numbers = [i if i % 2 == 1 else i**2 for i in range(10)]
print(numbers)
```


```.py
[0, 1, 4, 3, 16, 5, 36, 7, 64, 9]
```














#2.合計値を求める

##sum()関数を使った合計値の求め方

◯sum()関数を使うと、リストの要素の合計値を簡単に求めることができます。

```.py
#使うリストを用意する
numbers = [1,2,3,4,5]

#sum(リスト)というふうに使う
print(sum(numbers))
```

```.py
15
```

--------------------------------------------


##イテレータを使った合計値の求め方


```.py
numbers = [1,2,3,4,5,6]

#合計値を表す変数sum_of_numbersを定義する
#まだ何も足されていないので0に設定する
sum_of_numbers = 0

#forループを使って、リストの要素を1つずつ取得していく
#range()は'〜の間'という意味で、イテレーションの範囲を示す
#len(リスト)でリストの要素数(長さ)を取得する
for i in range(len(numbers)):
    #取得した要素を1つずつsum_of_numbersに追加していく
    sum_of_numbers += numbers[i]

print('sum of numbers = ', sum_of_numbers)
```

```.py
sum of numbers =  21
```

◯**Point**:イテレータ
イテレーション(繰り返し)ごとにリスト、辞書などから要素を1つずつ取り出して返すものです。
リストや辞書などは、イテレータに対応しているイテラブルオブジェクトです。
イテラブルオブジェクトは、他にも文字列、タプル、集合などがあります。

◯**Point**:　**+=,　-=,　*=,　/=,　//=,　%=,　**=**
計算した値を代入するという計算過程を略して書いたものです。
(例)

```.py
a = 3

#a = a * 5
a *= 5
print(a)
```
```.py
15
```
























#3.最大値を求める

##max()関数を使った最大値の求め方

◯max(リスト)という形で使用します
文字列を整数化してから、新しいリストに格納して、その中にある要素の最大値を求めてみます。

```.py
list_1 = ['1','2','3']

#list_1の要素をint()関数を使って整数に直してからnumbersリストに格納する
numbers = [int(i) for i in list_1]

print('numbers = ',numbers)
#リストの最大値をmax(リスト)という形で求める
print('max of numbers = ',max(numbers))
```
```.py
numbers =  [1, 2, 3]
max of numbers =  3
```

--------------

##比較を使った最大値の求め方

◯暫定の最大値と要素を比較していく方法です。

```.py

#リスト内包表記でリストの要素を定義してみる
#1以上11未満　かつ　2で割った余りが0　を満たす要素をリストに格納する
#リストは[2, 4, 6, 8, 10]となる
numbers = [number for number in range(1,11) if number % 2 == 0]

#先頭の要素(今回は2)を仮の最大値に設定する
max_of_numbers = numbers[0]

#リストの要素を1つずつ取り出していく。
#先頭の要素は比較対象ではないので除く
for i in range(1,len(numbers)):
    #もし、比較した要素が現在の最大値より大きければ
    if(max_of_numbers < numbers[i]):
        #最大値を更新する
        max_of_numbers = numbers[i]

print('numbers = ',numbers)
print('max of numbers = ', max_of_numbers)
```

```.py
numbers =  [2, 4, 6, 8, 10]
max of numbers =  10
```







#4.最小値を求める

##min()関数を使った最小値の求め方

◯min(リスト)という形で使用します

```.py
#0以上10未満までの範囲のなかで、偶数の値は2乗してからリストに格納する
#奇数の値はそのまま格納する
#リストは[0, 1, 4, 3, 16, 5, 36, 7, 64, 9]となる
numbers = [i if i % 2 == 1 else i**2 for i in range(10)]

print('numbers = ',numbers)
#リストの最小値をmin(リスト)という形で求める
print('min of numbers = ',min(numbers))
```
```.py
numbers = [0, 1, 4, 3, 16, 5, 36, 7, 64, 9]
min of numbers =  0
```

◯**Point**: if-else-
**もし-なら、でなければ-**という意味です。
条件に合致するかどうかを判断する比較の文です。
今回の場合は、
要素が奇数ならば(if i % 2 == 1)-する、でなければ(偶数ならば)要素を2乗する


------------

##比較を使った最小値の求め方

◯暫定の最小値と要素を比較していく方法です。
今回はランダムな整数のリストを作って、その中から最小値を選んでみます。

```.py
#randomモジュールをimportする
import random
#0から100までの整数のリストnumbersをつくる
numbers = [number for number in range(0,101)]
#numbersリストからランダムに要素を10個取り出してリスト化する
#このリストにある要素の最小値を求める
random_numbers = random.choices(numbers,k = 10)

#先頭の要素(今回は2)を仮の最小値に設定する
min_of_random_numbers = random_numbers[0]

#リストの要素を1つずつ取り出していく。
#先頭の要素は比較対象ではないので除く
for i in range(1,len(random_numbers)):
    #もし、比較した要素が現在の最小値より小さければ
    if(min_of_random_numbers > random_numbers[i]):
        #最小値を更新する
        min_of_random_numbers = random_numbers[i]

print('random_numbers = ',random_numbers)
print('min of random_numbers = ', min_of_random_numbers)
```

```.py
random_numbers =  [33, 99, 33, 27, 25, 42, 19, 37, 14, 15]
min of random_numbers =  14
```


◯**Point**:randomモジュール
今回は、randomモジュールの中にある、``choices(参照するもの,要素数)関数``を使います。
choices()関数を使うと、``k = ``で指定した数の要素のリストをつくることができます。
また、作成するリストの要素は、参照するもの(今回はnumbersリスト)からランダムに選んだ要素になります。

参考記事:[Pythonでリストからランダムに要素を選択するchoice, sample, choices](https://note.nkmk.me/python-random-choice-sample-choices/)












#最後に

読んでいただきありがとうございました。
次回は基礎統計量の計算Part2(平均値、中央値、最頻値)を書いていきたいと思います。
間違いや改善点等のご指摘くださると嬉しいです。