[Python-es] Buscar índices de un array (que cumple condición) de forma eficiente

Pablo Angulo pablo.angulo en uam.es
Jue Mar 4 13:29:59 CET 2010


Kiko escribió:
> Hola a todos.
>
> Estoy intentando buscar los indices de un subconjunto dentro de un
> conjunto y quiero saber si existe algo más eficiente que lo que he
> pensado.
>
> Me explico, por ejemplo, yo tengo:
>
> conjunto = range(1000, 1100, 1)
> subconjunto = range(1000, 1100, 3)
>
> Quiero saber la posición que tendría cada valor del subconjunto en el
> conjunto, es decir, subconjunto[0] tendría el índice 0 en conjunto
> (conjunto[0])), subconjunto[1] tendría el índice 3 en conjunto
> (conjunto[3])) y así.
>
> Estoy obteniendo los índices así
> indices = [conjunto.index(valor) for valor in subconjunto]
>
> Pero si conjunto y subconjunto son muy grandes se toma su tiempo.
>
> ¿Existe una forma más eficiente de obtener los índices?
si sabes que los elementos del subconjunto están ordenados dentro del
conjunto, no necesitas buscar en toda la lista cada vez, sino sólo desde
la última búsqueda

indices = []
ultimo = 0
for v in subconjunto:
    ultimo += conjunto[ultimo:].index(v)
    indices.append(ultimo)

[conjunto[j] for j in indices]==subconjunto
> True

También te puede interesar usar conjuntos, si no necesitas el orden de
los elementos.

Un saludo



Más información sobre la lista de distribución Python-es