使用由两个列表排序产生的排序来对第三列表进行排序?

PedsB:

说我有三个清单:

X = ["a", "b", "c", "d", "e", "f", "g", "h", "i"]
Y = [ 0,   1,   1,    0,   1,   2,   2,   0,   1]
Z = [ 5,   2,   3,    1,   4,   9,   6,   0,   7]

我可以很容易地根据Y对X进行排序:

XY_sort = [x for _,x in sorted(zip(Y,X))]
print(XY_sort)  # ["a", "d", "h", "b", "c", "e", "i", "f", "g"]

当我想根据产生XY_sort的排序对列表Z进行排序时,会产生疑问。理想情况下,我希望最终得到:

Z_sort = [5,   1,   0,   2,   3,   4,   7,   9,   6]

我猜测最好的方法是在X排序到XY_sort时以某种方式存储X的排序索引,然后使用这些索引对Z排序,但是我不知道该怎么做。任何帮助将不胜感激!

dawg:

您可以使用key参数来调用zip产生所需排序的元组的元素

>>> sorted(zip(X,Y,Z), key=lambda t: (t[1], t[0]))
[('a', 0, 5), ('d', 0, 1), ('h', 0, 0), ... ('f', 2, 9), ('g', 2, 6)]

然后过滤掉XY生成结果元组:

>>> [z for x,y,z in sorted(zip(X,Y,Z), key=lambda t: (t[1], t[0]))]
[5, 1, 0, 2, 3, 4, 7, 9, 6]

这样做的好处Z是根本不考虑排序顺序。键功能中只有两个元素相匹配X并被Y使用。


顺便说一句:我通常使用Python 3语法回答所有Python问题但是,Python 2对于lambda函数具有非常好的语法,该语法将自动解压缩作为参数传递的元组。

仅Python 2示例:

>>> sorted(zip(X,Y,Z), key=lambda (x,y,z): (y, x))
[('a', 0, 5), ('d', 0, 1), ... ('f', 2, 9), ('g', 2, 6)]
>>> [z for x,y,z in sorted(zip(X,Y,Z), key=lambda (x,y,z): (y, x))]
[5, 1, 0, 2, 3, 4, 7, 9, 6]

不幸的是,该语法已退出。


如评论中所述,这也适用:

>>> [z for z,y,x in sorted(zip(Z,Y,X), key=lambda t: t[1:])]
[5, 1, 0, 2, 3, 4, 7, 9, 6]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章