Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用由两个列表排序产生的排序对第三个列表进行排序?_Python_List_Sorting - Fatal编程技术网

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

Python 使用由两个列表排序产生的排序对第三个列表进行排序?,python,list,sorting,Python,List,Sorting,假设我有三个列表: 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]

假设我有三个列表:

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_排序的排序对列表Z进行排序时,会产生疑问。理想情况下,我希望以以下方式结束:

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

我猜最好的方法是,当X被排序为XY_排序时,以某种方式存储X的排序索引,然后使用这些索引对Z进行排序,但我不知道该怎么做。任何帮助都将不胜感激

你也可以用同样的方法排序。它将首先按Y排序,然后按X排序,如果两者相同,则将按Z排序:

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]


XYZ_sort = [z for y,x,z in sorted(zip(Y,X,Z))]
# [5, 1, 0, 2, 3, 4, 7, 9, 6]
[多亏评论者的顽强编辑]
如果
X-Y
组合可能不是唯一的,并且如果在这些情况下保持Z的相对顺序很重要,则可以传递作为排序键以获得干净的解决方案:

from operator import itemgetter

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

XYZ_sort = [z for y,x,z in sorted(zip(Y,X,Z), key=itemgetter(0, 1))]

#preseves the relative order of 5, -1, and 1
# [5, -1, 1, 1, 0, 2, 3, 4, 7, 9, 6]

你说“根据Y对X排序”,但你实际上是根据Y和X对X排序。如果只按Y对其进行排序,那么也可以将其用于Z。

您可以使用一个键参数调用
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)]
然后过滤掉结果元组中的
X
Y

>>> [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
的两个元素


顺便说一句:我通常用Python3语法回答所有Python问题。然而,Python2为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]

你可以使用
key=lambda t:t[:2]
(如果你
zip(Y,X,Z)
)。@superbrain:这很有创意。我补充说。我通常更喜欢显式地调用所使用的元素,这样我就不用想太多。希望您现在对Python 2语法的丢失少一点悲伤:-)(我也很喜欢…)这应该是一个注释,而不是答案。@MarkMeyer不,我不这么认为。我告诉他们如何实现他们显然真正想要的。