我有两个清单。
第一个列表已经排序(按照其他一些标准),这样列表中的前一个列表就越好。
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)
必须有一种比这更好的方法。有什么想法吗?
答案 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 = -1
和a = None
,您可以自行修改。