python_条件付きlist|dict|setからデータ取得

#前書
今回の記事はデータ取得に関して
実務の中で使えたら多少でも便利になる方法をいくつ紹介したいと思います

##三つの具体例を上げて説明していきます

###例題1
下記のlistからマイナスの数値を消したい

```python:qiita.py
"""下記のlistからマイナスの数値を消したい"""

[3 ,9 ,-1 ,10 ,-8 ,12 ]

```

###例題2
下記のdictから点数が90点以上の鈴木さんを探したい

```python:qiita.py

"""下記のdictから点数が90点以上の鈴木さんを探したい"""

{'suzuki':80,'suzuki_1':88,'suzuki_2':92....}

```

###例題3
下記のsetから3を割って余り0の数を探したい

```python:qiita.py

"""下記のsetから3を割って余り0の数を探したい"""

{88,44,76,52,32,6......}

```

##では具体的に見ていきます
###例題1
通常,リストから特定条件に満たす値を取り出したい場合、よく`for` ループ使います

```python:qiita.py

List = [3 ,9 ,-1 ,10 ,-8 ,12 ]

new_list = []

for x in List:
    if x >= 0:
       new_list.append(x)

print(new_list)
```
`[3 ,9 ,10 ,12 ]`このようなリストが得られるはずです
でもコードは結構長くなってしまい、もっとシンプルの方法も見てみましょう

#####リスト解析

```python:qiita.py
"""リストを作るためモジュールをインポート"""
from random import randint

"""ではリストを作っていきます"""
"""要素が10個-10から10までの間の乱数で構成されるlistがListに入ります"""
List = [randint(-10,10) for _ in range(10)]
#ここでループ用の変数を _ にしたのは他の所で使用しないためです,一種の決まり事みたいなものです

"""ではリストを解析していきます"""
new_list = [x for x in List if x >= 0]
```
`List`内に入ってるリストが`[4, 1, 4, -9, -3, -5, 3, 6, 6, -10]`とすれば
`new_list`に`[4, 1, 4, 3, 6, 6]`が入るはずです

ではもう一つの方法を見ていきましょう
#####filter()とlambda
関数`filter()`と`lambda`を使います
filter()の使い方は名の通りフィルターです
`filter('条件','フィルターかけたいリスト')`で使えます
`lambda`は無名関数と呼ばれて,発音は**ラムダ**です,呪文みたいで面白いですね
簡単な条件判断によく使われます
基本条件判断用関数を定義したい場合,もしコードが三行以内に収まる場合
`lambda`を代わりに使うことをお勧めします


```python:qiita.py

from random import randint

List = [randint(-10,10) for _ in range(10)]
         """この場合,新しいリストにマイナスの数が省かれます"""
new_list = list(filter(lambda x: x>=0 ,List))

```
この方法もマイナス数値を取り除くことができます
また`lambda x: x>=0 ,List`の部分は Listの要素がlambda式の要素として
`>=0`という条件で選別します,もし結果が`Ture`であれば、新しいリスト(new_list)の要素として入ります

###例題2

dictから同じクラスの鈴木さんからテストの成績が90点以上の鈴木さんを探したい

```python:qiita.py
from random import randint

"""先ず鈴木さんを作ります"""
List = {'suzuki%s' %i:randint(50,100) for i in range(1,21)}

print(List)
```
printしてみると`{'suzuki1': 87, 'suzuki2': 90, 'suzuki3': 85, 'suzuki4': 83, 'suzuki5': 91, 'suzuki6': 80, 'suzuki7': 82, 'suzuki8': 63, 'suzuki9': 99, 'suzuki10': 52, 'suzuki11': 57, 'suzuki12': 89, 'suzuki13': 67, 'suzuki14': 62, 'suzuki15': 97, 'suzuki16': 61, 'suzuki17': 56, 'suzuki18': 93, 'suzuki19': 98, 'suzuki20': 96}`20名の鈴木さんが入るリストが得られます

#####辞書解析
```python:qiita.py
from random import randint

List = {'suzuki%s' %i:randint(50,100) for i in range(1,21)}

new_list = {key:val for key,val in List.items() if val >= 90 }

print(new_list)
```
`new_list`をprintしてみると`{'suzuki2': 90, 'suzuki5': 91, 'suzuki9': 99, 'suzuki15': 97, 'suzuki18': 93, 'suzuki19': 98, 'suzuki20': 96}`点数が90点以上の鈴木さんリストが得らましたね

#####filter()とlambda
基本やり方はリストの時と同じですが,lambdaが使用できる要素が一つのため,辞書形の要素を渡す時は自動的にタプル形になります

```python:qiita.py
from random import randint

List = {'suzuki%s' %i:randint(50,100) for i in range(1,21)}

new_list =dict(filter(lambda item:item[1] >= 90 , List.items()))
```
これも同じ結果が得られます

###例題3
setから3を割って余り0の数字を見つける

```python:qiita.py
from random import randint
"""setを作ります"""
Set = {randint(0,20) for _ in range(20)}
```
条件としては0から20までの間のランダム数で要素が20のsetが作られるはずですが
でも実際`print(len(Set))`してみると何故か20個の要素が入ってません,それの理由は**まとめ**で説明させていただきます

####セット解析

```python:qiita.py
from random import randint

Set = {randint(0,20) for _ in range(20)}
new_set = {x for x in Set if x % 3 ==0}
```
`Set`に`{0, 1, 3, 4, 6, 7, 9, 10, 12, 13, 16, 17, 19}`が入っていれば
`new_set`の値は`{0, 3, 6, 9, 12}`のはずです

##まとめ
何故か`{randint(0,20) for _ in range(20)}`で作られたセットの要素が20より少ないのか,それはセットの構造と関係してます,同じ要素が一つしか存在してはいけませんからです
セット`x={1,2,2,3}`を作ったとして結果は`x={1,2,3}`になります