繁体   English   中英

根据另一个列表对列表进行排序,长度不均匀

[英]Sort a list according to another list, with uneven length

假设我有两个列表,l1 和 l2:

l1 = [1,9,6,8,3]
l2 = [8,1]

列表 l2 将根据列表 l1 的顺序进行排序,因此在这种情况下:

l2_reordered = [1,8]

注意:列表 l2 将始终有 2 个具有不同值的项目。

我可以想到一种简单的循环方法来做到这一点,但这将是非常低效的。 这样做的pythonic和有效的方法是什么?

这是一个快速的解决方案。 首先构建一个将值映射到索引的dict

d = {v:i for i, v in enumerate(l1)}

然后使用它来获取排序键:

r = sorted(l2, key=lambda v: d[v])

创建d是 O(len(l1)),排序是 O(len(l2)*log(len(l2)))。

SORT_ORDER = {_: l1.index(_) for _ in l1}
l2.sort(key=lambda _: SORT_ORDER[_])

想法来自:这里

您可以在将 l1 与 l2 元素匹配时遍历它。 每当您找到一个元素时,您都可以标记 l1 的索引,或者将该索引存储在新列表 l3 中。 现在最后你可以根据索引号对 l3 列表进行排序。

for ele in l2:
   l3.append(l1.index(ele))
l3.sort()
i=0
for ele in l3:
   l2[i]=l1[ele]
   i+=1

上面的代码从 l2 中取出所有的值,在 l1 中标记它们的索引号。然后我们对所有索引号进行排序,并将排序后的值放入 l2 中。 希望这能有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM