关于 Python 的“排序”方法是否稳定

on Python's "sorted" method being stable or not

提问人:troppapolvere 提问时间:11/3/2023 最后编辑:jonrsharpetroppapolvere 更新时间:11/3/2023 访问量:50

问:

我正在尝试使用以下代码对列表数组进行排序:

from operator import itemgetter

data=[['Japan',0],['Japan',36],['Japan',21],['Germany',7]]
for line in data: print(line)
print('---')
sort1=sorted(data,key=itemgetter(0))
for line in sort1: print(line)
print('---')
sort1=sorted(sort1,key=itemgetter(1))
for line in sort1: print(line)

在 Python 3.9.5 中,我发现它没有像我预期的那样工作:

['Japan', 0]
['Japan', 36]
['Japan', 21]
['Germany', 7]
---
['Germany', 7]
['Japan', 0]
['Japan', 36]
['Japan', 21]
---
['Japan', 0]
['Germany', 7]
['Japan', 21]
['Japan', 36]

对排序的第一次调用确实首先移动了“德国”,而没有触及其余部分; 但第二个,我希望通过离开“德国”来重新排列“日本”线 在上面,没有:它重新排序了第二个字段上的所有内容。

我已经在互联网上阅读了几个小时的文献和答案, 找到了很多关于如何做到这一点的教程,例如在第 29 点:按两个字段对 Python 列表进行排序,似乎我正在做同样的事情。但显然不是。

Python 排序 稳定性

评论

0赞 jonrsharpe 11/3/2023
您不是按两个字段排序,而是按一个字段排序,然后按其他字段重新排序。如果只想断开与第二个值的联系,则根本不需要自定义密钥。
0赞 troppapolvere 11/3/2023
我当然同意。但是我发布的页面,还有这个页面:docs.python.org/3/howto/sorting.html 向我保证,通过这样做,我将获得 2 个字段的排序。由于我不是,正如代码语义所暗示的那样,我的问题是:我如何在 2 个字段上进行排序,并打破平局?
0赞 Kelly Bundy 11/3/2023
你认为稳定意味着什么?
0赞 troppapolvere 11/3/2023
对一个字段进行排序后,共享其他字段相同值的所有记录将保持相同的顺序
0赞 jonrsharpe 11/3/2023
“我怎样才能在 2 个字段上进行排序,并打破平局?”- 就您而言,因为它们已经按正确的顺序排列:.或者按照操作方法的建议,因为 Python 的排序确实很稳定,您需要进行二次排序:按第 1 个值排序,然后按第 0 个值排序。sorted(data)

答: 暂无答案