我有一系列列表如下:
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']
在第一项之后维持订单并不重要。谢谢你的帮助。
答案 0 :(得分:5)
Python的排序是稳定的,因此无论如何,您都将在第一项之后维护订单。
li1.sort(key=lambda x: not x.startswith('b.'))
答案 1 :(得分:4)
重新排列每个列表中的项目,以便第一个项目为“b.something”
在第一项之后维持订单并不重要。
那不是排序。从概念上讲,你只是想把这个元素放在前面。
换句话说,您需要一个由该元素组成的列表,后面跟不是该元素的所有内容。对于有多个b.something
s的情况略微捏造这一点,并注意到只要第一个元素是b.something
我们不关心会发生什么,我们可以重新说明:满足条件的每个元素(“以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的回答。
答案 2 :(得分:3)
您可以使用接受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
就地更改输入并且不返回任何内容。两者的工作方式相同。