在第二个列表中查找一个列表的第一个实例

时间:2012-08-23 07:30:30

标签: python list numpy set

我有两个清单。

第一个列表已经排序(按照其他一些标准),这样列表中的前一个列表就越好。

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)

必须有一种比这更好的方法。有什么想法吗?

3 个答案:

答案 0 :(得分: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'

答案 1 :(得分:2)

使用allowedlist已经排序的事实的解决方案可能更有效(并且使用set,它们肯定是 - 线性时间与二次方式),但仅为了完整性,您现有的解决方案可以缩短了很多,临时名单被删除了:

min(allowedList, key=sortedList.index)

这使用Python的built-in min function,而不是来自numpy的np.min,主要仅在你使用numpy数组时才有用。使用列表时不需要它。

答案 2 :(得分: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,您可以自行修改。