リスト、辞書、コレクション生成式を使用してコードを短縮

6601 ワード

著者|Philip Wilkinsonコンパイル|VKソース|Towards Datas Science
Pythonを使って1年近くの間、私はよく「生成式」という言葉に出会ったが、私は生成式の正確な意味やその内容を生成しなかった.
最近になって、生成式があれば、リストを利用してコードを複数行から1行に短縮できることに気づきました.さらに,このコード短縮法はリストだけでなく辞書や集合にも用いることができる.
本稿では,リスト,辞書,集合における生成式の適用性と,日常的なプログラミングに必要なコード量をどのように減らすかを説明しようとする.
まず、生成式は、リスト、辞書、コレクションを1行で作成できるコードクリップです.これにより、forループに複数のローを使用する必要がなくなり、map()、filter()、reduce()関数を使用する必要も低減されます.
これらは、作成するデータ型に応じてカッコで構成され、1つの式が含まれ、1つのfor文と1つ以上のif文が続きます.エクスプレッション自体は何でも構いません.これは、編集可能である限り、多くの異なるオブジェクトをリストに入れることができることを意味します.従って,これらがコードに及ぼす可能性のある影響を,使用行数の減少と可読性の増加の観点から検討することは価値がある.
リスト#リスト#
pythonでは、次のようにアイテムをかっこ([])に入れてカンマで区切るだけでリストを作成できます.
list1 = [1, 2, 3, "hello", 7.0, 52]

これらは通常、さまざまな目的のプログラミングに使用されますが、長いフォーマットでforループを作成したり編集したりするのは面倒です.まず、リストの作成において、小さなリストは、次のような長いフォーマットで印刷されやすい場合があります.
nums = [1, 2, 3, 4, 5, 6, 7, 8]

しかし、この値が長くなると、すなわち0〜50の範囲内、さらに長くなり、それらは重くなる可能性がある.以下に示すように、forループでrange関数を使用して簡単に作成できます.
nums = []

for i in range(1, 51):
    nums.append(i)

print(nums)

# out: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50]

しかし、リスト生成式を使用して1行に短縮することができ、append()メソッドは必要ありません.
nums = [i for i in range(1,51)]

print(nums)

# out: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50]

基本的に、forループは1行に配置され、リストが初期化され、上記の例から第1行と第2行のコードの必要性が解消される.
リストに追加された数値に条件を追加し始めると、偶数のみが許可され、これらの数値が平方であることが望ましいなど、より重要になります.同様に、forループ生成も使用できます.以下に示します.
square_nums = []

for x in range(1,26):
    if x % 2 == 0:
        square_nums.append(x**2)

print(square_nums)

# out: [4, 16, 36, 64, 100, 144, 196, 256, 324, 400, 484, 576]

ただし、リスト生成式を使用して1行に短縮することもでき、範囲内でループしたり、条件を作成したり、結果を元のリストに添付したりするための行の必要性を低減できます.
square_nums = [x**2 for x in range(1,26) if x % 2 == 0]

print(square_nums)

#out: [4, 16, 36, 64, 100, 144, 196, 256, 324, 400, 484, 576]

ここで、数値の変換は行頭でx**2を実行し、forループは行中で実行し、xについては範囲(1,26)で、条件はx%2=0のように末尾で実行する.これは、すべての操作が1行で実行され、同じ出力を生成するために必要なコード量が減少するため、本質的にコードをより読み取りやすくする.
これにより、append()、map()、filter()またはreduce()メソッドが新しいリストを作成する際に既存のリストを操作する必要性を低減し、コードの複雑さを再び低減し、より読み取り可能にすることもできます.
同様の例は容易に入手でき,より多くの情報はこことここで容易に他の文章を通じてメディアで入手できる.しかしながら、これらの生成式は、辞書および集合にも用いることができることに留意されたい.
辞書
辞書は無秩序なデータセットであり、カッコとキーと値のペアを使用してインデックスを変更し、記述することができます.ここで、キーは値にアクセスするために使用され、情報を格納するためによく使用され、これらの情報はこれらの情報に有用である.次に、スコアを格納する例を示します.
Grades = {
    "Steven": 57,
    "Jessica": 82,
    "William": 42,
    "Hussein": 78,
    "Mary": 65,
    }
    
print(Grades)

# out: {'Steven': 57, 'Jessica': 82, 'William': 42, 'Hussein': 78, 'Mary': 65}

リストと同様に時間がかかる場合もあるので、forループや条件文を使用して構築できますが、生成式をより簡単に使用して構築できます.
たとえば、上で作成したリストでは、数値の平方だけでなく、元の数値も保存したいので、簡単に平方値を検索できます.次に、キー値ペアを含む辞書を簡単に作成できます.keyは元の数字を表し、valueは数字の平方を表します.forループの使用:
#    dict
even_squared_dict = {}

for x in range(1,10):
    if x % 2 == 0:
        even_squared_dict[x] = x**2

print(even_squared_dict)

# out: {2: 4, 4: 16, 6: 36, 8: 64}

ただし、ディクショナリ生成式を使用します.
even_sqaured_dict = {x: x**2 for x in range(1,10) if x % 2 ==0}

print(even_squared_dict)

# out: {2: 4, 4: 16, 6: 36, 8: 64}

本質的に、このリスト生成式との唯一の違いは、生成式を含むためにカッコを使用し、xをコロンの前に置いてキーを示すことです.
また、既存のリストに基づいた辞書を作成するために使用することもできます.たとえば、次の辞書生成式は、3桁の国コード、2桁の国コードのキーを持つ辞書を作成するために使用されます.2桁のコードは、3桁のコードの最初の2桁と同じです.
ThreeCharCodes = ["CAN", "FIN", "FRA", "GAB", "HKG", "IMN",
                  "MCO", "NPL"]
                  
cntryDict = {c: c[:2] for c in threeCharCodes}

print(cntryDict)

# out: {'CAN': 'CA', 'FIN': 'FI', 'FRA': 'FR', 'GAB': 'GA', 'HKG': 'HK', 'IMN': 'IM', 'MCO': 'MC', 'NPL': 'NP'}

しゅうごう
最後に、生成式は、リストまたはメタグループとは異なるデータ型であり、同じ要素の複数回の出現を格納できないコレクションの作成にも使用できます.
このようにすると、無秩序な値が格納されます.初期化方法は、set()にリストを渡すか、カンマで区切られた値をカッコで含めるかです(空のカッコは辞書を初期化しますが).次の例を示します.
Fruits1 = set(["apple", "banana", "cherry", "apple"])
print(Fruits1)

Fruits2 = {"orange", "pear", "grape", "pear"}
print(Fruits2)

# out: {'apple', 'cherry', 'banana'}
       {'grape', 'pear', 'orange'}

ここから,複数のappleまたはpear値が集合に伝達されているにもかかわらず,1つのインスタンスしか生成されていないことが明らかになった.同様に、forループを使用して、次のようにコマンドを生成できます.
import random

nums = set([])

for x in range(25):
    y = random.randint(10,20)
    nums.add(y)

print(nums)

# out: {10, 12, 14, 15, 16, 17, 18, 20}

25個のランダム整数は10〜20の間であるが、最終出力はリストに表示される25個の値ではなく、8個の一意の値のみを含む.同様に,集合に対する生成式を用いると,この文章をより簡潔に書くことができる.
nums = {random.randint(10,20) for num in range(25)}

print(nums)

# out: {11, 12, 13, 14, 15, 16, 17, 19, 20}

したがって,この生成式とリスト生成式の違いは,生成式を含む角括弧ではなく,大括弧を用いることである.
リストや辞書生成式と同様に、既存のリストでコレクションを生成するために使用することもできます.たとえば、1.6の除算に基づいてキロをマイルに変更するには、唯一の値だけが必要で、100キロ未満の値に制限されます.
kms = [10, 12, 65, 40, 12, 75, 34, 65, 10, 10, 38, 100, 160, 200]

miles = {d/1.6 for d in kms if d < 100}

print(miles)

# out: {0.625, 0.75, 2.5, 2.125, 4.0625, 4.6875, 2.375}

まとめ
したがって、生成式は、新しいリスト、辞書、および集合を作成するのに容易に使用することができる.これらを使用すると、生成に必要なローの数を減らし、可読性を向上させることができます.これらはappend()、map()、filter()またはreduce()関数の置換として使用できます.
これらを拡大して、lambda関数、ネストリスト生成式、またはマルチ条件文など、より複雑な生成式を実行できることは明らかです.しかしながら、このようにする場合、生成式はすぐに理解しにくくなる可能性があり、この場合、複数の操作を実行する必要がある場合に可読性を向上させるために、関数またはforループの作成に戻る価値がある.
原文リンク:https://towardsdatascience.co...
磐創AIブログサイトへようこそ:http://panchuang.net/
sklearn機械学習中国語公式ドキュメント:http://sklearn123.com/
磐創ブログリソース要約サイトへようこそ:http://docs.panchuang.net/