【问题标题】:sorting list of list w.r.t another list of lists in python排序列表w.r.t python中的另一个列表列表
【发布时间】:2017-07-21 10:21:24
【问题描述】:

我有两个列表,我想对第一个相对于第二个进行排序。例如这里我有两个

old = [[1, 7, 3, 2, 5, 4, 6, 0, 8, 9], 
       [7, 3, 2, 5, 4, 6, 1, 8, 0, 9], 
       [9, 2, 8, 7, 1, 5, 0, 4, 6, 3]]
new = [[4, 1, 5, 6, 7, 9, 10, 11, 8, 2, 3, 0], 
       [10, 6, 4, 3, 0, 11, 2, 5, 8, 1, 9, 7], 
       [0, 1, 7, 10, 9, 6, 4, 5, 8, 2, 3, 11]]

我想对列表的new 列表与old 的列表列表进行排序。所以对于新的条目应该变成

sorted_new = [[1, 7, 3, 2, 5, 4, 6, 0, 8, 9, 10, 11], 
              [7, 3, 2, 5, 4, 6, 1, 8, 0, 9, 10, 11], 
              [9, 2, 8, 7, 1, 5, 0, 4, 6, 3, 10, 11]]

需要注意的重要一点是要匹配的两个列表的大小不同。我怎样才能做到这一点?

【问题讨论】:

  • 但我不太清楚“相对于另一个列表”是什么意思。特别是因为列表的大小不同。你能解释一下输入是如何映射到输出的吗?
  • 根据您的示例,您不会对列表进行排序,您只需将列表 new 附加到列表中尚未出现的 old 元素。
  • 对我来说这个问题完全不清楚。似乎“排序的新”根本没有排序?

标签: python python-2.7 list sorting


【解决方案1】:

您可以使用以下方法:

sorted_new = []
for sub_new,sub_old in zip(new,old):
    old_idx = {k:v for v,k in enumerate(sub_old)}
    sorted_new.append(sorted(sub_new,key=lambda x:old_idx.get(x,len(sub_old))))

然后生成:

>>> sorted_new
[[1, 7, 3, 2, 5, 4, 6, 0, 8, 9, 10, 11], [7, 3, 2, 5, 4, 6, 1, 8, 0, 9, 10, 11], [9, 2, 8, 7, 1, 5, 0, 4, 6, 3, 10, 11]]

代码的工作方式如下:我们首先同时运行newold 这两个列表。对于每对这样的列表。我们首先使用字典理解生成一个字典,它将sub_old 的元素映射到它们在列表中的对应索引。

接下来我们为sub_new 构造一个排序列表。如果sub_new 的元素在old_idx 中,我们返回索引(这就是排序键)。如果不是,我们返回一个默认的len(sub_old),它因此大于字典中的所有索引。结果,该元素将被放置在列表的右侧。

由于 Python 的排序函数保证稳定,这意味着不在old 中的元素将保持原来的顺序。

我们可以在list.index(..) 方法周围使用一些魔法,而不是构建这样的索引字典。但是.index(..) 的问题在于它在O(n) 中运行。所以这将使每个子列表的算法O(m×n log n)mold中元素的数量,n em> new 中的元素个数。

【讨论】:

  • 正是我想做的。非常感谢:)
猜你喜欢
  • 2022-12-22
  • 2013-12-29
  • 1970-01-01
  • 2012-10-31
  • 2011-03-29
  • 1970-01-01
  • 2021-05-02
  • 2021-03-10
  • 1970-01-01
相关资源
最近更新 更多