繁体   English   中英

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

[英]What is the best way to sort list with custom sorting parameters in Python?

我有一系列列表如下:

li1 = ['a.1', 'b.9', 'c.8', 'd.1', 'e.2']
li2 = ['a.4', 'b.1', 'c.2', 'd.2', 'e.4']

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

li1 = ['b.9', 'a.1', 'c.8', 'd.1', 'e.2']
li2 = ['b.1', 'a.4', 'c.2', 'd.2', 'e.4']

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

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

li1.sort(key=lambda x: not x.startswith('b.'))

重新排列每个列表中的项目,以便第一项是'b.something'

在第一个项目之后维护订单并不重要。

那不是排序。 从概念上讲,你只是想把这个元素带到前面。

换句话说,您需要一个由该元素组成的列表,后面跟不是该元素的所有内容。 对于存在多个b.something的情况b.something这一点,并注意到只要第一个元素是b.something我们不关心会发生什么,我们可以重新说明:符合所有元素的列表condition(“以b.开头”),然后是每个不符合条件的元素。 (这有时称为分区 ;请参阅例如C ++中的std::partition 。)

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

[x for x in li if x.startswith('b.')] + [x for x in li if not x.startswith('b.')]

...或者你可以假装你正在排序,只是在应用key后只有一堆真正只有两个值的元素,并应用相应的key ,如Ignacio Vasquez-Abrams的回答。

您可以使用sorted ,它接受一个key参数,并返回一个列表:

>>> li1 = ['a.1', 'b.2', 'c.8']
>>> def k(s):
...     if s.startswith('b.'):
...         return 1
...     else:
...         return 2
...
>>> sorted(li1, key=k)
['b.2', 'a.1', 'c.8']

k应返回可在可迭代项之间进行比较的内容。

注意: sort就地更改输入并且不返回任何内容,当sorted返回排序列表并且不修改列表时。 两者的工作方式相同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM