Python:如何对数组X进行排序,但对Y进行相同的相对排序?

Kal*_*iMa 3 python sorting

例如

X=[5,6,2,3,1]
Y=[7,2,3,4,6]
Run Code Online (Sandbox Code Playgroud)

我排序X:

X=[1,2,3,5,6]
Run Code Online (Sandbox Code Playgroud)

但是我希望将相同的相对排序应用于Y,因此数字保持在相同的位置,如前所述:

Y=[6,3,4,7,2]
Run Code Online (Sandbox Code Playgroud)

我希望这是有道理的!

mgi*_*son 7

通常情况下,你做了zip- sort- unzip

>>> X = [5,6,2,3,1]
>>> Y = [7,2,3,4,6]
Run Code Online (Sandbox Code Playgroud)

现在将它们排序:

>>> sorted(zip(X,Y))
[(1, 6), (2, 3), (3, 4), (5, 7), (6, 2)]
Run Code Online (Sandbox Code Playgroud)

将其与"解压缩"(zip(*...))配对

>>> zip(*sorted(zip(X,Y)))
[(1, 2, 3, 5, 6), (6, 3, 4, 7, 2)]
Run Code Online (Sandbox Code Playgroud)

你可以解压缩:

>>> X,Y = zip(*sorted(zip(X,Y)))
>>> X
(1, 2, 3, 5, 6)
>>> Y
(6, 3, 4, 7, 2)
Run Code Online (Sandbox Code Playgroud)

现在你有了对象tuple而不是list对象,但如果你真的需要,你可以将其转换回来.


正如评论中指出的那样,这确实引入了对排序中第二个列表的轻微依赖:考虑列表:

X = [1,1,5,7] #sorted already
Y = [2,1,4,6] #Not already sorted.
Run Code Online (Sandbox Code Playgroud)

通过上面的"食谱",在一天结束时,您将得到:

X = (1,1,5,7)
Y = (1,2,4,6) 
Run Code Online (Sandbox Code Playgroud)

这可能是出乎意料的.要解决这个问题,您可以将key参数传递给sorted:

from operator import itemgetter
X,Y = zip(*sorted(zip(X,Y),key=itemgetter(0)))
Run Code Online (Sandbox Code Playgroud)

演示:

>>> X
[1, 1, 5, 7]
>>> Y
[2, 1, 4, 6]
>>> XX,YY = zip(*sorted(zip(X,Y)))
>>> XX
(1, 1, 5, 7)
>>> YY
(1, 2, 4, 6)
>>> from operator import itemgetter
>>> XX,YY = zip(*sorted(zip(X,Y),key=itemgetter(0)))
>>> XX
(1, 1, 5, 7)
>>> YY
(2, 1, 4, 6)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这可能会稍微改变顺序(重复值将在第二个元素的子顺序中,而不是在输入顺序中). (2认同)