Было бы круто иметь что-то подобное в этом. Python не делает этого. Есть несколько интересных решений, использующих itertools. (Это также заставило меня пожелать itertools.takewhile_false
. Если бы оно существовало, они были бы более читабельными.)
>>> from itertools import takewhile
>>> import re
>>> m = re.compile('foo.*')
>>> print len(tuple(itertools.takewhile(lambda x: not m.match(x), lst)))
1
Это была моя первая идея, но она требует от вас создания временного кортежа и его длины. Тогда мне пришло в голову, что вы можете просто сделать простую сумму и избежать временного списка:
>>> print sum(1 for _ in takewhile(lambda x: not m.match(x), lst))
1
Но это также несколько громоздко. Я предпочитаю избегать одноразовых переменных, когда это возможно. Давайте попробуем это снова.
>>> sum(takewhile(bool, (not m.match(x) for x in lst)))
1
Намного лучше.