2012-08-23 16 views
6

Tengo dos listas.Encontrar la primera instancia de una lista en una segunda lista

La primera lista ya está ordenada (por algunos otros criterios) de modo que cuanto antes en la lista, mejor.

sortedList = ['200', '050', '202', '203', '206', '205', '049', '047', '042', '041', '043', '044', '046', '045', '210', '211', '306', '302', '308', '309', '311', '310', '221', '220', '213', '212'] 

La segunda lista es una lista de valores permitidos:

allowedList = ['001','002','003','004','005','006','007','008','009','010','203','204','205','206','207','212','213','215','216'] 

me gustaría seleccionar el valor más alto clasificado que existe en el allowedList, y yo sólo voy a formas tontas de haciendo esto. Cosas como esta:

import numpy as np 
temp = [] 
for x in allowedList: 
    temp.append(sortedList.index(x)) 
np.min(temp) 

Tiene que haber una manera mejor que esta. ¿Algunas ideas?

Respuesta

2

Las soluciones que usan el hecho de que allowedlist ya están ordenadas son probablemente más eficientes (y usando set, ciertamente son - tiempo lineal vs cuadrático), pero para completar, su solución existente puede acortarse mucho y la temporal lista eliminado:

min(allowedList, key=sortedList.index) 

Esto utiliza Python built-in min function, en lugar de la de numpy - np.min es principalmente sólo es útil si se está utilizando con matrices numpy; no hay necesidad de usar listas.

3

Así es como se podría hacer esto sin numpy

>>> sorted_list = ['200', '050', '202', '203', '206', '205', '049', '047', '042', '041', '043', '044', '046', '045', '210', '211', '306', '302', '308', '309', '311', '310', '221', '220', '213', '212'] 
>>> allowed_list = ['001','002','003','004','005','006','007','008','009','010','203','204','205','206','207','212','213','215','216'] 
>>> allowed_set = set(allowed_list) 
>>> next((x for x in sorted_list if x in allowed_set), None) 
'203' 
0
allowedSet = set(allowedList) 
i, a = next(((i, a) for i, a in enumerate(sortedList) if a in allowedSet), (-1, None)) 

i es índice del primer elemento de tales (3), a es ese elemento ('203').

Si, en cualquier caso, las dos listas no tienen elementos comunes, i = -1 y a = None, que puede modificar usted mismo.

Cuestiones relacionadas