Я бы сделал что-то попроще, например так:
def outer_gen(iterable):
iterable = iter(iterable)
first_item = next(iterable)
info = first_item[0]
yield info, first_item[1:]
for item in iterable:
yield info, item
Это выполнит 4 первые строки только один раз, затем войдет в цикл и выдаст то, что вы хотите.
Вы, вероятно, хотитедобавьте немного try
/ except
к cacth IndexErrors
здесь и там.
Если вы хотите принимать значения, когда они начинаются с чего-то или наоборот, помните, что вы можете использовать множество вещей изitertools
набор инструментов, и в частности dropwhile
, takewhile
и chain
:
>>> import itertools
>>> l = ['+foo', '-bar', '+foo']
>>> list(itertools.takewhile(lambda x: x.startswith('+'), l))
['+foo']
>>> list(itertools.dropwhile(lambda x: x.startswith('+'), l))
['-bar', '+foo']
>>> a = itertools.takewhile(lambda x: x.startswith('+'), l)
>>> b = itertools.dropwhile(lambda x: x.startswith('+'), l)
>>> list(itertools.chain(a, b))
['+foo', '-bar', '+foo']
И помните, что вы можете создавать генераторы, такие как списки понимания, сохранять их в переменных и связывать их, каквы бы передали команды linux:
import random
def create_item():
return random.choice(('+', '-')) + random.choice(('foo', 'bar'))
random_items = (create_item() for s in xrange(10))
added_items = ((i[0], i[1:]) for i in random_items if i.startswith('+'))
valid_items = ((prefix, line) for prefix, line in added_items if 'foo' in line)
print list(valid_items)
При всем этом вы сможете найти какой-нибудь питонический способ решения вашей проблемы: -)