Подтвердить что ты не робот

Проверьте, существует ли элемент в кортеже кортежей

У меня есть список кортежей, которые выглядят так:

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

Какой лучший способ проверить, существует ли значение в этом кортеже? Например, я хочу сказать:

'apple' in CODES

и получите True

4b9b3361

Ответ 1

Вы ищете any():

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

В сочетании с простым выражением генератора это выполняет задание. Выражение генератора принимает каждый кортеж и дает True, если оно содержит 'apple'. any() затем возвращает True, когда первый элемент, который он запрашивает, возвращает True (в противном случае False). Следовательно, это делает то, что вы хотите. Он также хорошо читается - если какой-либо из кортежей содержит 'apple'.

Если вы делаете это много раз и нуждаетесь в производительности, возможно, стоит сделать набор всех значений, чтобы вы могли сделать это очень быстро:

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

Естественно, что построение этого будет медленным и использование памяти, поэтому это не будет хорошей идеей, если вам не нужна большая производительность и будет выполнять много проверок членства.

Ответ 2

Вы можете использовать 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

Для сравнений производительности вы можете проверить мой другой ответ.