You can use a generator expression with next()
to find the first match, or None
if nothing matched. This still requires a loop:
found = next((tup for tup in outer_tuple if tup.id == desired_id), None)
The alternative is to use a dictionary keyed on id
instead.