2012-08-23 139 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) 

這將使用Python的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 = -1a = None

相關問題