Python 3 列表排序与决胜局

Posted

技术标签:

【中文标题】Python 3 列表排序与决胜局【英文标题】:Python 3 list sorting with a tie-breaker 【发布时间】:2019-06-15 11:27:34 【问题描述】:

我在这里看到了很多类似的问题,但到目前为止,他们都没有直接回答这个问题,而是针对提问者的问题在特定场景中提供了解决方法。

我想要一个关于在 Python 的 Timsort 中打破关系的问题的一般性答案。可以做到吗?如果可以的话,一般的做法是什么。

以元组列表为例

>>> tuples = [(2,1), (2,9), (3, 8), (1,3), (1,2), (1,1)]

我想对这些元组进行排序,以便它们的顺序主要由每个元组中第一个值的值确定。如果我们离开reversed=False,那么它们将按升序排列。 我会用以下方法做到这一点

>>> tuples.sort(key=lambda t: t[0])

结果是

>>> tuples
[(1,3), (1,2), (1,1), (2,1), (2,9), (3, 8)]

问题是我一般可以做些什么来打破前三个元素之间的关系。我想知道这是否通常可行并适用于定义排序键的任何问题。

大多数时候其他答案会提到 Timsort 稳定。这条规则是否意味着不能断绝关系?

【问题讨论】:

你的意思是tuples.sort()?元组上的比较以您想要的方式工作。 (如果您实际上没有元组列表,则您的键函数可以返回一个元组。) 稳定 表示如果出现平局,则保留原始订单。您仍然可以创建一个带有 tie-breaker 因素的密钥,这样实际的平局就变得不可能了。 【参考方案1】:

据我了解,您希望先对初始值进行排序,然后对第二个元组值进行排序,而不会丢失初始排序列表。

试试这个

tuples.sort(key=lambda x: (x[0], x[1]))

在这种情况下,x[0] 和 x[1] 分别是主要和次要排序键。希望这会有所帮助。

【讨论】:

这是默认操作,根本不包含key 参数。 很高兴知道这一点。感谢您的评论。我想它只有在你想对一个与元组中的值顺序不匹配的序列进行一系列排序时才有用。

以上是关于Python 3 列表排序与决胜局的主要内容,如果未能解决你的问题,请参考以下文章

Python列表操作与深浅拷贝——列表深浅拷贝删除反转排序

Python ❀ 列表与元组

Python ❀ 列表与元组

Python ❀ 列表与元组

python算法之排序

50-python基础-python3-列表-函数sorted() 对列表进行临时排序