Я использую генераторы для поиска в списках, как в этом простом примере:
>>> a = [1,2,3,4]
>>> (i for i, v in enumerate(a) if v == 4).next()
3
(Просто чтобы немного обрамить пример, я использую гораздо более длинные списки по сравнению с приведенным выше, и записи немного сложнее, чем int
. Я делаю это таким образом, чтобы не приходилось каждый раз просматривать все списки. я их ищу)
Теперь, если бы я вместо этого изменил это на i == 666
, он вернул бы StopIteration
, потому что не может найти запись 666
в a
.
Как я могу заставить его возвращать None
вместо этого? Я мог бы, конечно, обернуть это в предложение try ... except
, но есть ли более питонический способ сделать это?
if i in a: ...
? - person Manny D   schedule 18.08.2011if i in a
не поможет, если вы хотите получить индекс найденного элемента. - person senderle   schedule 18.08.2011a.index(i)
. Вы не понимаете тонкостей использованияenumerate
, правда, но я действительно понимаю, почему вы должны использовать генератор для поиска в списке. - person Manny D   schedule 18.08.2011index
. Кроме того, если вы хотите проверить что-то другое, кроме простого равенства, например, если вы хотите найти первый элемент, равный › 5, тогдаindex
не поможет. Тем не менее, вы правы в том, что в конкретном примере c00kiemonsterindex
является более разумным подходом. - person senderle   schedule 18.08.2011if i in a
- person c00kiemonster   schedule 18.08.2011__iter__
своего класса, чтобы иметь возможность использовать идиомуif i in a
. - person Manny D   schedule 18.08.2011