2012-04-30 18 views
6

Durante dos listas,partido de lista en Python: obtener índices de una sub-lista en una lista más grande

a = [1, 2, 9, 3, 8, ...] (no duplicate values in a, but a is very big) 
b = [1, 9, 1,...]   (set(b) is a subset of set(a), 1<<len(b)<<len(a)) 

indices = get_indices_of_a(a, b) 

cómo vamos get_indices_of_a retorno indices = [0, 2, 0,...] con array(a)[indices] = b? ¿Hay un método más rápido que usar a.index, que tarda demasiado?

Haciendo b un conjunto es un método rápido de búsqueda de listas y volviendo índices (ver compare two lists in python and return indices of matched values), pero perderá el índice de la segunda 1 así como la secuencia de los índices en este caso.

Respuesta

12

Un método rápido (cuando a es una lista grande) estaría utilizando un diccionario para asignar valores de a a los índices:

>>> index_dict = dict((value, idx) for idx,value in enumerate(a)) 
>>> [index_dict[x] for x in b] 
[0, 2, 0] 

Esto llevará tiempo lineal en el caso promedio, en comparación con el uso de a.index cuales tomaría tiempo cuadrático.

+0

+1. Esta es una buena respuesta para listas grandes donde reducirá drásticamente el tiempo necesario: naturalmente, en listas pequeñas, la creación del dict llevará más tiempo de lo que ahorrará. Dado el comentario del que hace la pregunta sobre mi respuesta, parece que hay grandes listas involucradas, así que esta es la respuesta deseada. –

7

Suponiendo que estamos trabajando con listas más pequeñas, esto es tan fácil como:

>>> a = [1, 2, 9, 3, 8] 
>>> b = [1, 9, 1] 
>>> [a.index(item) for item in b] 
[0, 2, 0] 

en las listas más grandes, esto va a llegar a ser bastante caro.

(Si hay duplicados, la primera aparición siempre será la que se hace referencia en la lista resultante, si es not set(b) <= set(a), obtendrá un ValueError).

+0

¡Muchas gracias! No hay duplicados, pero a es muy grande, yb tampoco es pequeño, aunque len (b) << len (a). Usar un .index (elemento) está haciendo una búsqueda en a para cada valor en b ... ¿hay un método más rápido? – user1342516

+0

@ user1342516 Sí, ver [respuesta de interjay] (http://stackoverflow.com/a/10385786/722121). –

+0

puede agregar esto a su solución para eliminar la situación ValueError: [un.index (elemento) para el elemento en b si el elemento en a] –

Cuestiones relacionadas