反復によるリスト内の複数の値のメンバーシップのテスト
リスト内の複数の値のメンバーシップをテストするときの Python の動作は、混乱を招く可能性があります。 ['b', 'a', 'foo', 'bar'] で 'a','b' を使用すると ('a', True) が返され、結果が最初の要素が最初の値であるタプルであることが示されます。チェックされており、2 番目の要素はその値のメンバーシップです。リスト内の複数の値のメンバーシップをテストするには、次のアプローチをお勧めします。
all(x in ['b', 'a', 'foo', 'bar'] for x in ['a', 'b'])
このステートメントは、all() 関数内でジェネレーター式を使用して、2 番目のリスト内の各値のメンバーシップをテストします。
代替アプローチ
反復ベースの方法は一般に信頼性が高いですが、代替アプローチも存在します。セットを使用すると、サブセット テスト オプションが提供されます。
set(['a', 'b']).issubset(set(['a', 'b', 'foo', 'bar']))
ただし、セットにはハッシュ可能な要素のみを含めることができるため、その用途が制限されます。
速度に関する考慮事項
一般にサブセット テストの方が高速ですが、その違いが顕著になるのはコンテナとアイテムの両方が小さい場合のみです。ほとんどの場合、all() 関数を使用すると依然として効率的です。
項目がすでにリスト内にある場合は、サブセット テストを使用する前にそれらをセットに変換すると、若干の速度向上が得られます。セットではないコンテナをセットに変換することは、速度向上が最小限であり、追加のストレージ オーバーヘッドが問題となる可能性があるため、推奨されません。
例外的なケース
の場合多数の値のメンバーシップをテストする場合、特に一部の値がコンテナー内にない場合、 all() はサブセット テストよりも速度に大きな利点をもたらします。これは、コンテナ内に存在しないテスト要素をバイパスできる短絡動作によるものです。
概要
一般的に使用する場合、要素がハッシュ可能である場合は、コンテナをセットに追加することをお勧めします。サブセット テストは、テスト項目がすでにセットに格納されている場合にのみ有利です。多数の値のメンバーシップのテストなど、特定の状況では、all() が優れたパフォーマンスを提供します。
以上がPython リスト内の複数の値のメンバーシップを効率的にテストする方法: 反復、セット、または all()?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。