问题描述
我有一个奇怪的问题,所以我将为您演示它,以使其更易于理解。我有两个列表:
>>> a = [1,2,20,6,210]
>>> b = [20,1]
我要查找的结果是3(基于b中的匹配项,列表a中最后一个匹配项的位置)
b总是具有较少的数据,因为它包含列表a的所有重复项。我想知道B中的哪个项目与列表a中的最匹配。因此,在此示例中,它将是6,因为A列表中的6最远。
是否有一种简便的方法-我最初的方法是嵌套循环,但我怀疑还有一种更简单的方法?
解决方法
最简单(不一定是最有效的)代码就是:
max(b,key=a.index)
或者如果您希望对整个list
进行排序,而不仅仅是描述的最大值,请选择以下其中一项:
b.sort(key=a.index)
或
sorted(b,key=a.index)
如果引用list
中有重复项,并且您需要获取值的最后一个索引,请用one of these simulations of rindex
替换index
。
更新:解决获取职位而不是价值的要求,有另一种解决方法,可以减少工作量。基本上是对one of the better solutions to emulating rindex
的修改:
bset = frozenset(b)
last_a_index = len(a) - next(i for i,x in enumerate(reversed(a),1) if x in bset)
这使工作降至O(m + n)
(对于其他解决方案则为O(m * n)
),并且使a
上的环路短路;它反向扫描,直到在b
中找到一个值,然后立即生成索引。可以简单地将其扩展以使用a[last_a_index]
产生值,因为在b
中找到它的位置并不重要。代码更复杂,但是速度更快,尤其是在a
/ b
可能很大的情况下。
自从您请求了职位:
>>> max(map(a.index,b))
3