在第二个列表中找到第一个与第一个列表相同的实例

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)

一定有比这更好的方法。你有什么想法吗?

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'

2
使用已排序的 allowedlist 的解决方案可能更有效(如果使用 set,它们肯定是 - 线性时间 vs 平方时间),但仅为完整起见,您现有的解决方案可以大大缩短且消除临时列表:
min(allowedList, key=sortedList.index)

这里使用了Python的内置的min函数,而不是numpy中的函数——np.min主要只有在与numpy数组一起使用时才有用;在使用列表时没有必要使用它。

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,您可以自行修改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接