如何根据另一个列表顺序排序列表?

问题描述

我有一个奇怪的问题,所以我将为您演示它,以使其更易于理解。我有两个列表:

>>> 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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...