2012-08-23 2 views
6

У меня есть два списка.Поиск первого экземпляра одного списка во втором списке

Первый список уже отсортирован (по некоторым другим критериям) таким образом, что чем раньше в списке, тем лучше.

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'] 

Второй список приведен список допустимых значений:

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

Я хотел бы, чтобы выбрать самое высокие отсортированное значение, которое существует в allowedList, и я только придумываю глупыми способами делая это. Вещи вроде этого:

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

Должен быть лучший путь, чем это. Есть идеи?

ответ

2

Решения, использующие то, что allowedlist уже отсортированы, вероятно, более эффективны (и, используя set, они, безусловно, являются линейным временем и квадратичным), но только для полноты ваше существующее решение может быть сокращено много, а временное список устранен:

min(allowedList, key=sortedList.index) 

Это использует Питон built-in min function, а не один из NumPy - np.min в основном полезен, только если вы используете их с Numpy массивами; при использовании списков нет необходимости.

3

Вот как вы могли бы сделать это без 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 является индекс первого такого элемента (3), a является то, что элемент ('203').

Если в любом случае два списка не имеют общих элементов, i = -1 и a = None, которые вы можете изменить самостоятельно.

Смежные вопросы