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)

必须有比这更好的方法。有任何想法吗?

4

3 回答 3

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'
于 2012-08-23T07:34:46.890 回答
2

allowedlist使用已经排序的事实的解决方案可能更有效(并且使用 a set,它们当然是 - 线性时间与二次),但仅出于完整性考虑,您现有的解决方案可以缩短很多,并消除临时列表:

min(allowedList, key=sortedList.index)

这使用 Python 的内置min函数,而不是来自 numpy 的函数 -np.min主要仅在将它们与 numpy 数组一起使用时有用;使用列表时不需要它。

于 2012-08-23T07:46:34.857 回答
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,您可以自己修改。

于 2012-08-23T07:43:45.573 回答