2012-08-23 140 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

相关问题