On 04/03/10 16:43, Kiko wrote:

indices = []
ultimo = -1
for i in subconjunto:
     ultimo = conjunto.index(i, ultimo+1)
     indices.append(ultimo)
     #yield ultimo

El yield me da error tal como lo he puesto ¿?.

Claro, un "yield" sólo funciona dentro de un generador. Supongo que nunca has trabajado con ellos, busca información por google, por ejemplo:

http://docs.python.org.ar/tutorial/classes.html#generadores

De verdad que vale la pena, los generadores son una de las herramientas más potentes de Python. Para crear un generator tendrás que definirlo (también con "def", aunque no es una función). En nuestro ejemplo:

def gen():
  ultimo = -1
  for v in subgroup:
      ultimo = group.index(v, ultimo+1)
      yield ultimo

Si haces gen() verás que devuelve (inmediatamente, ya que no lo ha ejecutado todavía) un objeto generador, no una lista; siempre puedes obtener el resultado completo en forma de lista, así: list(gen()). Pero muchas veces uno no quiere tener toda la lista, sólo iterar (una vez) sobre el resultado. En ese caso:

for item in gen():
  # hacer algo con item

Por último: Daniel proponía usar bisect; con la misma idea, y refactorizando un pelín, quedaría así:

def get_positions(group, subgroup):
  index = 0
  for element in subgroup:
      index = bisect.bisect(group, element, index)
      yield index-1

arnau
_______________________________________________
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/

Responder a