2012-08-23 3 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을 사용하면 분명히 선형 시간 대 2 차 방정식입니다), 그러나 완벽을 기하기 위해 기존 솔루션을 많이 단축하고 임시로 줄일 수 있습니다 목록 삭제 :

min(allowedList, key=sortedList.index) 

이 오히려 NumPy와의 일보다, 파이썬의 built-in min function 사용 - 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 = -1a = None을 직접 수정할 수 있습니다.

관련 문제