【问题标题】:Sort a list according to another list, with uneven length根据另一个列表对列表进行排序,长度不均匀
【发布时间】:2020-07-21 22:55:29
【问题描述】:

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

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

列表 l2 会按照列表 l1 的顺序进行排序,所以在这种情况下:

l2_reordered = [1,8]

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

我可以想到一种简单的循环方法来执行此操作,但这将是非常低效的。什么是pythonic和有效的方法?

【问题讨论】:

  • 也许您应该更清楚地解释如何对第二个列表进行排序...
  • 第二个列表是过滤器吗?
  • 是否应该根据l1订购?
  • 同意!看看我所做的编辑,希望现在更清楚了
  • 编辑的问题更清晰。听起来l2 中的每个元素都必须在l1 中。排序与l1 中的排序匹配。值可以重复吗?例如。 l2可以是[8, 1, 8]吗?

标签: python


【解决方案1】:

这是一个快速的解决方案。首先构建一个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)))。

【讨论】:

  • +1 我们的方法非常相似,但我认为 enumerate() 比 index() 快得多,而且您还添加了复杂性分析。
  • 另外 +1 用于增加时间复杂度
  • @MarcoD.G.谢谢!是的,从 dict 理解中调用 index 会使 dict 创建 O(len(l1)**2),并且没有必要,因为无论如何你都在迭代元素,所以你只需要保持计数。您还可以在range(len(l1)) 上迭代索引i,然后使用l1[i]:ienumerate 更方便一点。无论哪种方式都是 O(len(l1))。
【解决方案2】:
SORT_ORDER = {_: l1.index(_) for _ in l1}
l2.sort(key=lambda _: SORT_ORDER[_])

创意来自:here

【讨论】:

    【解决方案3】:

    您可以在将 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中。希望这能有所帮助。

    【讨论】:

      猜你喜欢
      • 2018-11-15
      • 1970-01-01
      • 2023-04-01
      • 2021-05-02
      • 2011-03-22
      • 1970-01-01
      • 1970-01-01
      • 2013-09-17
      相关资源
      最近更新 更多