前書
今回の記事はデータ取得に関して
実務の中で使えたら多少でも便利になる方法をいくつ紹介したいと思います
三つの具体例を上げて説明していきます
例題1
下記のlistからマイナスの数値を消したい
"""下記のlistからマイナスの数値を消したい"""
[3 ,9 ,-1 ,10 ,-8 ,12 ]
例題2
下記のdictから点数が90点以上の鈴木さんを探したい
"""下記のdictから点数が90点以上の鈴木さんを探したい"""
{'suzuki':80,'suzuki_1':88,'suzuki_2':92....}
例題3
下記のsetから3を割って余り0の数を探したい
"""下記のsetから3を割って余り0の数を探したい"""
{88,44,76,52,32,6......}
では具体的に見ていきます
例題1
通常,リストから特定条件に満たす値を取り出したい場合、よくfor
ループ使います
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 ]
このようなリストが得られるはずです
でもコードは結構長くなってしまい、もっとシンプルの方法も見てみましょう
リスト解析
"""リストを作るためモジュールをインポート"""
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
を代わりに使うことをお勧めします
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点以上の鈴木さんを探したい
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名の鈴木さんが入るリストが得られます
辞書解析
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が使用できる要素が一つのため,辞書形の要素を渡す時は自動的にタプル形になります
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の数字を見つける
from random import randint
"""setを作ります"""
Set = {randint(0,20) for _ in range(20)}
条件としては0から20までの間のランダム数で要素が20のsetが作られるはずですが
でも実際print(len(Set))
してみると何故か20個の要素が入ってません,それの理由はまとめで説明させていただきます
セット解析
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}
になります