Вот Pythonic способ сделать это:
data = [['a','b'], ['a','c'], ['b','d']]
search = 'c'
any(e[1] == search for e in data)
Или ... ну, я не собираюсь утверждать, что это "один истинный Pythonic способ" сделать это, потому что в какой-то момент становится немного субъективным, что является Pythonic, а что нет, или какой метод более питонский, чем другой. Но использование any()
определенно является более типичным стилем Python, чем цикл for
, как, например, RichieHindle ответ ,
Конечно, в реализации any
есть скрытый цикл, хотя он выходит из цикла, как только находит совпадение.
Поскольку мне было скучно, я создал временный скрипт для сравнения производительности различных предложений, модифицируя некоторые из них по мере необходимости, чтобы сделать API одинаковым. Теперь мы должны помнить, что самый быстрый не всегда лучший, и быть быстрым - это совсем не то же самое, что быть Pythonic. При этом результаты ... странные. Очевидно, что for
петли очень быстрые, а это не то, что я ожидал, поэтому я взял бы их с крошкой соли, не понимая, почему они вышли так, как они.
В любом случае, когда я использовал список, определенный в вопросе, с тремя подсписками по два элемента в каждом, от самого быстрого до самого медленного, я получал следующие результаты:
- ответ RichieHindle с петлей
for
с тактовой частотой 0,22 мкс
- Первое предложение Теренса Хонлса , которое создает список, при 0,36 мкс
- Ответ Пьера-Люка Бедара (последний кодовый блок) , при 0,43 мкс
- По существу связаны между ответом Маркуса и
for
петлей из исходного вопроса , при 0,48 мкс
- Ответ Coady с использованием
operator.itemgetter()
, при 0,53 мкс
- Достаточно близко, чтобы считаться связующим звеном между ответом Алекса Мартелли с
ifilter()
и ответом Анона при 0,67 мкс (ответ Алекса примерно на полсекунды быстрее)
- Еще одна достаточно тесная связь между ответом Джоджо , моим, Брэндона Э. Тейлора (который идентичен моему) и вторым предложением Теренса Хонлеса с использованием
any()
, все поступают при 0,81-0,82 мкс
- А затем ответ пользователя 27221 с использованием понимания вложенного списка, при 0,95 мкс
Очевидно, что фактическое время не имеет смысла на чьих-либо аппаратных средствах, но различия между ними должны дать некоторое представление о том, насколько близки различные методы.
Когда я использую более длинный список, все немного меняется. Я начал со списка в вопросе, с тремя подсписками, и добавил еще 197 подсписков, всего 200 подсписков, каждый из которых имеет длину два. Используя этот более длинный список, вот результаты:
- ответ RichieHindle , с теми же 0,22 мкс, что и с более коротким списком
- Ответ Coady с использованием
operator.itemgetter()
, снова при 0,53 мкс
- Первое предложение Теренса Хонлеса , которое создает список, при 0,36 мкс
- Еще одна виртуальная связь между ответом Алекса Мартелли с
ifilter()
и ответом Анона , при 0,67 мкс
- Опять достаточно тесная связь между моим ответом, идентичным методом Брэндона Э. Тейлора и вторым предложением Теренса Хонлеса с использованием
any()
, все поступают в 0,81-0,82 мкс
Это те, которые сохраняют свое первоначальное время при расширении списка. Остальные, которые этого не делают,
- Петля
for
из исходный вопрос , при 1,24 мкс
- Первое предложение Теренса Хонлса , которое создает список, при 7,49 мкс
- Ответ Пьера-Люка Бедара (последний кодовый блок) , при 8,12 мкс
- ответ Маркуса , при 10,27 мкс
- ответ Jojo , при 19,87 мкс
- И, наконец, ответ пользователя 27221 с использованием понимания вложенного списка, при 60,59 мкс