Pythonセットの包括的な:それらを使用する方法と時期
Python のセット内包表記は、コード内でセットを作成および操作するための簡潔な方法を提供します。クリーンな構文でセットを生成し、コードをより読みやすく Python っぽくします。セット内包表記を使用すると、セットの作成、変換、フィルター処理を行うことができます。これは、Python プログラミング ツールキットに追加するのに最適なスキルです。
このチュートリアルの終わりまでに、あなたはそれを理解するでしょう:
- Pythonには set comprehensions があります。これにより、簡潔な構文でセットを作成できます。
- Python にはリスト、セット、辞書、およびジェネレータの4 種類の内包表記があります。表現。
- 設定された理解は、
{iterableのアイテムの式[条件]}
として記述できます。 - セットにはすべての要素が一意であることが保証されるため、 セットには重複を含めることはできません。
このチュートリアルを最大限に活用するには、for
ループ、反復可能、リスト内包表記、辞書内包表記などの Python の基本概念を理解している必要があります。
Pythonでセットを作成および変換します
Python プログラミングでは、セットを作成、設定、変換する必要がある場合があります。これを行うには、セット リテラル、set()
コンストラクター、および for
ループを使用できます。次のセクションでは、これらのツールの使用方法を簡単に説明します。また、Python でセットを操作する強力な方法であるセット内包表記についても学びます。
リテラルと set()
を使用してセットを作成します
新しいセットを作成するには、リテラルを使用できます。セット リテラルは、中括弧で囲まれた一連の要素です。セットリテラルの構文を以下に示します。
{element_1, element_2,..., element_N}
要素はハッシュ可能なオブジェクトである必要があります。リテラル内のオブジェクトは重複する可能性がありますが、結果のセットにはインスタンスが 1 つだけ保存されます。セットでは要素の重複は許可されません。セットの簡単な例を次に示します。
>>> colors = {"blue", "red", "green", "orange", "green"}
>>> colors
{'red', 'green', 'orange', 'blue'}
>>> colors.add("purple")
>>> colors
{'red', 'green', 'orange', 'purple', 'blue'}
この例では、カラー名を含むセットを作成します。結果のセットの要素は、一意の文字列オブジェクトです。 .add()
メソッドを使用して新しい要素を追加できます。セットは順序付けられていないコレクションであるため、結果のセットの要素の順序は、ほとんどの場合、挿入順序と一致しないことに注意してください。
注:セットの詳細については、Pythonチュートリアルのセットをご覧ください。
set()
コンストラクターとオブジェクトの反復可能オブジェクトを使用して、新しいセットを作成することもできます。
>>> numbers = [2, 2, 1, 4, 2, 3]
>>> set(numbers)
{1, 2, 3, 4}
この例では、数値のリストを使用して set()
を使用して新しいセットを作成します。結果のセットに重複要素が含まれていないことに注意してください。実際には、 set()
コンストラクターは、反復性の重複値を排除するための優れたツールです。
空のセットを作成するには、引数なしで set()
コンストラクターを使用します。
>>> set()
set()
curly braces {}
のペアは、セットではなく空の辞書を表すため、文字通りの空のセットを作成することはできません。空のセットを作成するには、 set()
constructorを使用する必要があります。
for
ループを使用してセットを設定する
時には、空のセットから始めて、それを動的に要素に入力する必要があります。これを行うには、ループにを使用できます。たとえば、テキストから一意の単語のセットを作成したいとします。ループでこれを行う方法は次のとおりです。
>>> unique_words = set()
>>> text = """
... Beautiful is better than ugly
... Explicit is better than implicit
... Simple is better than complex
... Complex is better than complicated
... """.lower()
>>> for word in text.split():
... unique_words.add(word)
...
>>> unique_words
{
'beautiful',
'ugly',
'better',
'implicit',
'complicated',
'than',
'explicit',
'is',
'complex',
'simple'
}
この例では、まず set()
を使用して空のセットを作成します。 . lower()
メソッドを使用してテキストに小文字を適用すると、単語抽出で大文字と小文字が区別されなくなります。次に、テキストから抽出された単語のリストに対してループを実行します。
簡単なアプローチとして、.split()
メソッドを使用して、スペース文字を区切り文字として使用してテキストを個々の単語に分割しました。
注: この例で使用されているテキストは、Python の設計哲学をサポートする一連の原則である Python の禅の一部です。
ループは、各反復でセットに単語を追加しようとします。ただし、単語がすでにセットにある場合は、新しいインスタンスは追加されません。そのため、結果のセットには、たとえば better
のインスタンスが1つしかありません。ループは読みやすく明確ですが、セットの理解を使用してコードをさらに簡潔にすることができます。
セットの包括的な紹介
セット内包表記を使用すると、1 行の for
ループでセットを構築できます。リスト内包表記に慣れていれば、集合内包表記もすぐに理解できるでしょう。どちらの構造も同様の構文を持ちます。主な違いは、集合内包表記では角括弧の代わりに中括弧が使用されることです。
これが、設定された理解のための構文です:
{expression for member in iterable [if condition]}
セットの理解が新しいセットを返します。このセットを構築するには、入力の項目から要素を繰り返し可能にします。構文には、最後にオプションの条件付きが含まれています。これは、既存のコレクションを条件付きでフィルタリングしたり、要素を生成したりするために使用できます。
集合内包表記構文は、次の 4 つの主要な要素で構成されます。
- ブラケットの囲い: curly braces(
{}
)を使用して、設定された理解を定義します。 - 理解式:各反復に要素を提供する式。
- 現在の
member
: これは、反復可能オブジェクト内の現在の項目または値の名前です。 -
iterable
:これは、リスト、タプル、セット、ジェネレーター、または同様のタイプを含むPython反復オブジェクトです。
次のコードは、内包表記を使用して一意の単語のセットを構築する方法を示しています。
>>> text = """
... Beautiful is better than ugly
... Explicit is better than implicit
... Simple is better than complex
... Complex is better than complicated
... """.lower()
>>> {word for word in text.split()}
{
'beautiful',
'ugly',
'better',
'implicit',
'complicated',
'than',
'explicit',
'is',
'complex',
'simple'
}
この例では、設定された理解を使用して、元のテキストから一意の単語を抽出します。構文は簡潔で明確で、コードの読みやすさが向上します。
実際には、セットの要素を生成するためにデータを変換する必要がない場合は、前のセクションのループと上記の理解を次のコードに置き換えることができます。
>>> set(text.split())
{
'beautiful',
'ugly',
'better',
'implicit',
'complicated',
'than',
'explicit',
'is',
'complex',
'simple'
}
この例では、分割テキストを set()
constructorに直接渡し、ループまたは理解と同じ結果を取得します。これを行うことができます。セット要素は変換を実行する必要がないためです。
内包表記には複数の for
句を含めることもできます。その場合、左端の for
は外側のコレクションを反復し、次の for
は左から右に最初のネスト レベルを反復し、以下同様に続きます。
説明のために、リストのリストがあるとします。ネストされた各リストには数値が含まれており、それらの平方値を含むセットを作成したいとします。これを行うには、以下に示すように 2 つの for
句を含む内包表記を使用できます。
>>> matrix = [
... [9, 3, 8, 3],
... [4, 5, 2, 8],
... [6, 4, 3, 1],
... [1, 0, 4, 5],
... ]
>>> {value**2 for row in matrix for value in row}
{64, 1, 0, 4, 36, 9, 16, 81, 25}
この例では、最初の for
ループが行列の行を反復処理します。 2 番目の for
ループは、各行の数値を反復処理します。その結果、一連の平方値が得られます。
この例では、16の要素を持つ代わりに、9つだけになることに注意することが重要です。これは、設定要素が一意であるためです。要素が複製されている場合、新しいインスタンスは最終セットに追加されません。
Pythonでセットの包括を活用します
セット内包表記を使用すると、新しいセットの作成、既存のセットの変換、さらには条件を使用して要素をフィルター処理することができます。次のセクションでは、集合内包表記を使用してこれらのユースケースにアプローチする方法を学びます。
まず、内包表記を使用して既存の反復可能オブジェクトから新しいセットを作成する方法を学びます。
iterablesからセットを作成します
場合によっては、反復可能なデータがあり、データ項目を使用してセットを作成し、データ変換を通じて要素を生成したいことがあります。
たとえば、ツールとライブラリのリストがあるとします。特定のツールがリストに載っているかどうかを継続的に確認する必要があります。これを行うには、メンバーシップテストを使用します。また、コードケースを鈍感にする必要があるため、すべての単語を小文字に変換することにします。
セットは、メンバーシップテストのリストよりも効率的です。したがって、ツールのリストを小文字のセットに変換することも決定します。
>>> tools = ["Python", "Django", "Flask", "pandas", "NumPy"]
>>> tools_set = {tool.lower() for tool in tools}
>>> tools_set
{'django', 'numpy', 'flask', 'pandas', 'python'}
>>> "python".lower() in tools_set
True
>>> "Pandas".lower() in tools_set
True
>>> "Numpy".lower() in tools_set
True
強調表示された行では、すべての値を正規化しながら、一貫した比較を確保するためにすべての値を正規化しながら使用します。次に、 in
演算子を使用してメンバーシップテストを実行し、特定のツールが元のリストにあるかどうかを判断します。
繰り返しますが、入力反復可能項目にデータ変換を適用する必要がない場合は、集合内包表記を使用する必要はありません。代わりに set(iterable)
を使用できます。上の例では、変換はツール名を小文字に変換することで構成されます。
既存のセットの変換
セット内包表記を使用して、既存のセットをすばやく変換することもできます。ユーザーが入力した一連の電子メール アドレスがあるとします。一部のアドレスに大文字だけでなく先頭と末尾のスペースが含まれていることに気づき、これを修正したいと考えています。さらに重要なのは、メール アドレスが重複していることに気づきました。
あなたはこれを理解してクリーンアップすることにしました。
>>> emails = {
... " alice@example.org ",
... "BOB@example.com",
... "charlie@EXAMPLE.com",
... "David@example.net",
... " bob@example.com",
... "JohnDoe@example.com",
... }
>>> {email.strip().lower() for email in emails}
{
'alice@example.org',
'bob@example.com',
'johndoe@example.com',
'charlie@example.com',
'david@example.net'
}
強調表示された行では、 .strip()
メソッドを使用して、各アドレスから先頭および後続のスペースを削除するセットの理解があります。次に、 .lower()
を使用して、すべてのアドレスに小文字を適用します。クリーンアップの結果、セットには一意のアイテムのみが含まれるため、重複するアドレスが削除されます。
セットからアイテムをフィルタリングします
場合によっては、既存のセットをフィルタリングし、特定の要件または条件を満たす要素を備えた新しいセットを作成する必要があります。たとえば、 .com
電子メールのみを抽出するように設定されたメールアドレスをフィルタリングするとします。これを行うには、次の理解を使用できます。
>>> emails_set = {
... "alice@example.org",
... "bob@example.com",
... "johndoe@example.com",
... "charlie@example.com",
... "david@example.net",
... }
>>> {email for email in emails_set if email.endswith(".com")}
{'bob@example.com', 'charlie@example.com', 'johndoe@example.com'}
この例では、条件を使用して、.com
ドメインの電子メール アドレスのみを含むセットを作成します。
セットの包含をいつ使用するかを決定します
通常のループまたは関数呼び出しの組み合わせの代わりに集合内包表記を使用するかどうかを決定するときは、次の要素を考慮する必要があります。
- 簡潔さ: セット内包表記は、同等の
for
ループと比較してコードの量を削減します。 - 読みやすさ:包括的に設定すると、コードがより明確で読みやすくなります。
実際には、次の操作を実行する必要がある場合は、セットの包括的なを使用できます。
- データ変換を適用して、既存の反復可能性からセットを作成します
- 既存のセットの要素を変換します
- 既存のセットの要素をフィルタリングします
これまでのところ、セットの概念を使用してこれらすべての操作を行う方法を学びました。それでも、Pythonコーディングエクスペリエンス中に、包括的なを設定するための他の適切なユースケースを見つけることができます。
さらに、集合内包表記を使用する必要がない状況もあります。たとえば、反復可能オブジェクトから重複した項目を削除する必要がある場合は、次の構文を使用するだけです。
>>> set([2, 2, 1, 4, 2, 3])
{1, 2, 3, 4}
set 要素を生成するために入力データを変換する必要がない場合は、set()
コンストラクターを使用するだけで済みます。これは、反復可能オブジェクトから重複した項目を削除する優れた方法です。ただし、入力反復可能オブジェクト内のオブジェクトはハッシュ可能である必要があり、要素の元の順序は保持されないことに注意することが重要です。
よくある悪い習慣を調査する
Python コードで集合内包表記を使用する場合、避けるべき悪い習慣がいくつかあります。最も一般的なものには次のようなものがあります。
- 複雑な式を使用して
- 複数の
for
句または条件を使用してネストされた内包表記を作成する - 外部からアクセス理解変数を試みます
- セット要素を構築するときのコストの高い変換を実行します
時には、理解の式が複雑すぎると、設定された理解があります。
たとえば、数値のリストからセットを作成したとします。数値が偶数の場合は、その 2 乗が必要になります。それ以外の場合は、その立方体が必要になります。これを行うには、次の内包を使用できます。
>>> numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> {number**2 if number % 2 == 0 else number**3 for number in numbers}
{64, 1, 4, 36, 100, 16, 343, 729, 27, 125}
この理解では、比較的複雑な式を使用してセット要素を生成します。この理解を読んで、それが何をするのかを解読するのは難しいかもしれません。複雑な式によってコードが読みにくくなっている場合は、代わりに通常の for
ループを使用すると便利な場合があります。
>>> result_set = set()
>>> for number in numbers:
... if number % 2 == 0:
... value = number**2
... else:
... value = number**3
... result_set.add(value)
...
>>> result_set
{64, 1, 4, 36, 100, 16, 343, 729, 27, 125}
このループは内包表記と同じ結果を生成しますが、より明示的になり、コードが読みやすくなります。
条項または条件のいくつかのを使用したネストされた包括的な包括的な包括的なものは、コードを読み取りの低下にすることができます。したがって、通常、それらを避け、通常のループのようなより読みやすいコンストラクトを使用する必要があります。
内包表記内で定義した変数を内包表記自体の外で使用しようとすることはできません。
>>> {number**3 for number in range(1, 11)}
{64, 1, 512, 8, 1000, 343, 216, 729, 27, 125}
>>> number
Traceback (most recent call last):
...
NameError: name 'number' is not defined
number
変数は、理解内にのみ表示されます。理解の外でそれを使用しようとする場合、 nameerror
例外を取得します。
時々、設定された包括的な操作の場合、設定された要素を生成するために費用のかかるデータ変換を実行する必要がある場合があります。これらの状況では、最終セットを構築するにはかなりの時間がかかる場合があることに注意する必要があります。可能な回避策は、オンデマンドの要素を生成するジェネレーターを使用することです。
結論
Python set comprenions について詳しく学びました。これらは、簡潔でクリーンな構文を使用してセットを作成、変換、フィルタリングするための強力なツールです。また、セットの包括的なを使用するときに避けるべきいくつかの悪いプラクティスについても学びました。
集合内包表記は、Python 開発者にとって優れたツールです。これらは、Python でセットを操作するための Python 的で合理的な方法を提供します。
このチュートリアルでは、次のことを行いました。
- 作成簡潔な構文を備えた新しいセット
- 変換された包括的なセットは包括的です
- フィルタリング既存のセットからの不要な要素
- 決定コードでセットの概念を使用するタイミング
これらのスキルがあれば、セットを処理するための、より読みやすい Python 的なコードを作成できます。集合内包表記を使い続けると、集合内包表記が非常に貴重なツールであることがわかります。
よくある質問
Python の集合内包表記についてある程度の経験ができたので、以下の質問と回答を使用して理解度を確認し、学んだことを要約できます。
これらの FAQ は、このチュートリアルで説明した最も重要な概念に関連しています。各質問の横にある表示/ 非表示切り替えをクリックして、答えを表示します。
セット内包表記は、リスト内包表記と同様の構文を使用して Python でセットを作成する簡潔な方法です。主な違いは、集合内包表記では中かっこ {}
が使用されるのに対し、リスト内包表記では角かっこ []
が使用されることです。結果は、一意の要素の順序付けされていないコレクションであるセットになります。
set endulfension syntax: {expression for recers in iterable}
を使用して、反復可能なセットを作成できます。これにより、反復可能な各メンバーの式を評価し、結果をセットに追加し、すべての要素が一意になるようにします。
セットを簡潔に作成してコードの可読性を向上させたい場合は、通常のループではなくセット内包表記の使用を検討する必要があります。これらは、反復可能なデータを変換またはフィルタリングして一意のセット要素を生成する場合に特に役立ちます。
一般的な悪い実践には、包括的に過度に複雑な式を使用すること、条項または条件の複数のを含むネストされた包括的な包括的な概念を作成すること、理解の外側の理解変数にアクセスしようとする、パフォーマンスを低下させる可能性のある費用のかかる変換を実行することが含まれます。
はい、理解度の最後に条件付きを追加することにより、SET Comprehensionsを使用して要素をフィルタリングできます。これには、条件が true
と評価する要素のみが含まれます。