Цикл (или что-то на 100% эквивалентное, например, понимание списка или genexp) - действительно единственный подход, если ваша структура внешнего уровня является кортежем, как вы указываете - по преднамеренному замыслу кортежи являются чрезвычайно легкими контейнер, практически без каких-либо методов (только несколько специальных методов, необходимых для реализации индексации, циклического выполнения и т. п .; -).
Молниеносный поиск является характеристикой словарей, а не кортежей. Разве у вас нет словаря (в качестве основной или вспомогательной структуры), который сопоставляет «значение третьего элемента» с искомым поднабором (или, возможно, с его индексом в основном кортеже)? Это можно построить с помощью одного цикла, а затем выполнить столько быстрых поисков, сколько вам нужно!
Если вы решите зациклить, Genexp, согласно комментарию Брайана и моего ответа на него, будет более читабельным и в среднем может быть в два раза быстрее, чем listcomp (так как он выполняет только половину цикла):
my_thing = next(item for item in things if item[2] == "Blurgle")
, который читается как «следующий элемент в вещах, чей [2] подэлемент равен Blurgle» (когда вы начинаете с начала, «следующий» элемент, который вы найдете, будет «первым»), и, в твой случай, только - подходящий).
Если вам нужно охватить случай, когда ни один элемент не соответствует предикату, вы можете передать next
второй аргумент (который он будет возвращать при необходимости), в противном случае (без второго аргумента, как в моем фрагменте) вы ' Я получу исключение StopIteration, если ни один элемент не соответствует предикату - любое поведение может быть тем, что вы хотите (как вы говорите, случай не должен возникать, исключение выглядит подходящим для вашего конкретного приложения, поскольку рассматриваемое вхождение было бы неожиданной ошибкой) .