在Python中使用自定义排序参数对列表进行排序的最佳方法是什么?

drb*_*sen 6 python sorting list

我有一系列列表如下:

li1 = ['a.1', 'b.9', 'c.8', 'd.1', 'e.2']
li2 = ['a.4', 'b.1', 'c.2', 'd.2', 'e.4']
Run Code Online (Sandbox Code Playgroud)

如何重新排列每个列表中的项目,以便第一项是"b.something"?对于上面的例子:

li1 = ['b.9', 'a.1', 'c.8', 'd.1', 'e.2']
li2 = ['b.1', 'a.4', 'c.2', 'd.2', 'e.4']
Run Code Online (Sandbox Code Playgroud)

在第一个项目之后维护订单并不重要.谢谢您的帮助.

Ign*_*ams 5

Python的排序是稳定的,因此无论如何,您都将在第一项之后维护订单.

li1.sort(key=lambda x: not x.startswith('b.'))
Run Code Online (Sandbox Code Playgroud)


Kar*_*tel 4

重新排列每个列表中的项目,使第一项为“b.something”

在第一个项目之后维持顺序并不重要。

那么这不是排序。从概念上讲,您只是想将该元素放在前面。

换句话说,您需要一个由该元素组成的列表,后跟不是该元素的所有内容。对于有多个b.somethings 的情况,稍微捏造一下,并注意到只要第一个元素是 a b.something,我们就不关心会发生什么,我们可以改写:满足条件的每个元素的列表(“以b.”开头) ),后面跟着每个不满足条件的元素。(这有时称为分区;参见std::partitionC++ 中的示例。)

在 Python 中,这就像用列表推导式描述这两个列表组件并将它们粘在一起一样简单:

[x for x in li if x.startswith('b.')] + [x for x in li if not x.startswith('b.')]
Run Code Online (Sandbox Code Playgroud)

...或者您可以假装您正在排序,只是使用一堆在应用后实际上只有两个值的元素key,并应用适当的key,如 Ignacio Vasquez-Abrams 的答案中所示。