次のようなタプルのリストがあります。
CODES = (
('apple', 'reddelicious'),
('caramel', 'sweetsticky'),
('banana', 'yellowfruit'),
)
そのタプルに値が存在するかどうかを確認する最良の方法は何ですか? たとえば、次のように言えるようになりたいです。
'apple' in CODES
そして真になる
あなたが探しているany()
:
if any('apple' in code for code in CODES):
...
単純なジェネレータ式と組み合わせると、これがタスクを実行します。ジェネレーター式は各タプルを受け取り、True
含まれている場合は生成します'apple'
。any()
その後True
、要求した最初のアイテムが返されたときに返されますTrue
(そうでない場合はFalse
)。したがって、これはあなたが望むことを行います。また、タプルのいずれかに'apple'
.
これを何度も実行していて、パフォーマンスが必要な場合は、すべての値のセットを作成して、これを非常に迅速に実行できるようにすることをお勧めします。
cache = set(itertools.chain.from_iterable(CODES)))
当然のことながら、これを構築するのは遅く、メモリを消費するため、多くのパフォーマンスが必要で、多くのメンバーシップ チェックを行う場合を除き、良い考えではありません。
使用できますitertools.chain()
:
と一緒in
に使用すると、 のように短絡しany()
ます。
In [30]: CODES = (
....: ('apple', 'reddelicious'),
....: ('caramel', 'sweetsticky'),
....: ('banana', 'yellowfruit'),
....: )
In [31]: from itertools import chain
In [32]: 'apple' in chain(*CODES)
Out[32]: True
In [33]: 'foo' in chain(*CODES)
Out[33]: False
パフォーマンスの比較については、他の回答を確認してください。