31

次のようなタプルのリストがあります。

CODES = (
    ('apple', 'reddelicious'),
    ('caramel', 'sweetsticky'),
    ('banana', 'yellowfruit'),
)

そのタプルに値が存在するかどうかを確認する最良の方法は何ですか? たとえば、次のように言えるようになりたいです。

'apple' in CODES

そして真になる

4

2 に答える 2

59

あなたが探しているany()

if any('apple' in code for code in CODES):
    ...

単純なジェネレータ式と組み合わせると、これがタスクを実行します。ジェネレーター式は各タプルを受け取り、True含まれている場合は生成します'apple'any()その後True、要求した最初のアイテムが返されたときに返されますTrue(そうでない場合はFalse)。したがって、これはあなたが望むことを行います。また、タプルのいずれかに'apple'.

これを何度も実行していて、パフォーマンスが必要な場合は、すべての値のセットを作成して、これを非常に迅速に実行できるようにすることをお勧めします。

cache = set(itertools.chain.from_iterable(CODES)))

当然のことながら、これを構築するのは遅く、メモリを消費するため、多くのパフォーマンスが必要で、多くのメンバーシップ チェックを行う場合を除き、良い考えではありません。

于 2013-02-27T23:48:44.043 に答える
9

使用できます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

パフォーマンスの比較については、他の回答を確認してください。

于 2013-02-27T23:49:10.030 に答える