Python:如何根据另一个列表的列表对列表进行排序?

4
以下是我要解决的用例:
我有两个列表的列表:(ld
In [1197]: l
Out[1197]: 
[['Cancer A', 'Ecog 9', 'Fill 6'],
 ['Cancer B', 'Ecog 1', 'Fill 1'],
 ['Cancer A', 'Ecog 0', 'Fill 0']]

In [1198]: d
Out[1198]: [[100], [200], [500]]

这是一个由两部分构成的问题:

  1. 根据值的优先级对 l 进行排序。例如: Cancer, EcogFill (在本例中为 key=(0,1,2))。它可以是任何东西,比如Ecog, Cancer, Fill,那么 key=(1,0,2)
  2. 以与在上一步中对 l 进行排序的顺序相同的方式对 d 进行排序。

我能够完成第一步,代码参考以下:

In [1199]: import operator
In [1200]: sorted_l = sorted(l, key=operator.itemgetter(0,1,2))

In [1201]: sorted_l
Out[1200]: 
[['Cancer A', 'Ecog 0', 'Fill 0'],
 ['Cancer A', 'Ecog 9', 'Fill 6'],
 ['Cancer B', 'Ecog 1', 'Fill 1']]

现在,我想要按照与 sorted_l 相同的顺序对 d 的值进行排序。
预期输出:
In [1201]: d
Out[1201]: [[500], [100], [200]]

怎样做是最佳的方式?


2
不,这不是标记问题的重复。请仔细阅读问题。 - Mayank Porwal
基本上,你只需要将列表压缩在一起。对其进行排序,但要在键函数中考虑它,因此如果你执行 sorted(zip(l, d), key=lambda pair: (pair[0][0], pair[0][1], pair[0][2]))。请注意,正如我上面提到的,你的键函数没有做任何有用的事情,所以在这种特定情况下,你只需执行 sorted(zip(l, d), key=itemgetter(1)) - juanpa.arrivillaga
我认真地阅读了问题,我想这就是您想要的代码:l_sorted, d_sorted = map(list, zip(*sorted(zip(l, d), key=lambda x: x[0])))。我错过了什么吗? - juanpa.arrivillaga
这正是链接重复项告诉你该如何做的。这就是我一再告诉你要做的。但在这里,你如何对第二个示例中的 l 进行排序? - juanpa.arrivillaga
是的,这个方法可行。谢谢你。我仍然觉得如果你把这个作为答案,它会解决很多疑问。如果你能这样做就太好了。我也重新表述了我的问题。 - Mayank Porwal
显示剩余10条评论
1个回答

0
以下是在@juanpa.arrivillaga的帮助下得出的解决方案:
In [1272]: import operator
In [1273]: key = operator.itemgetter(0, 1, 2)

# Here param key, lets you sort `l` with your own function.
In [1275]: sorted_l,sorted_d = zip(*sorted(zip(l, d), key=lambda x: key(x[0])))

In [1276]: sorted_l
Out[1276]: 
(['Cancer A', 'Ecog 0', 'Fill 0'],
 ['Cancer A', 'Ecog 9', 'Fill 6'],
 ['Cancer B', 'Ecog 1', 'Fill 1'])

In [1277]: sorted_d
Out[1277]: ([500], [100], [200])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接