4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

前書

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

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

例題1

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

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

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

例題2

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

qiita.py

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

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

例題3

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

qiita.py

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

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

では具体的に見ていきます

例題1

通常,リストから特定条件に満たす値を取り出したい場合、よくfor ループ使います

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 ]このようなリストが得られるはずです
でもコードは結構長くなってしまい、もっとシンプルの方法も見てみましょう

リスト解析
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を代わりに使うことをお勧めします

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点以上の鈴木さんを探したい

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名の鈴木さんが入るリストが得られます

辞書解析
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が使用できる要素が一つのため,辞書形の要素を渡す時は自動的にタプル形になります

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の数字を見つける

qiita.py
from random import randint
"""setを作ります"""
Set = {randint(0,20) for _ in range(20)}

条件としては0から20までの間のランダム数で要素が20のsetが作られるはずですが
でも実際print(len(Set))してみると何故か20個の要素が入ってません,それの理由はまとめで説明させていただきます

セット解析

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}になります

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?