Каков наилучший способ сортировки списка с пользовательскими параметрами сортировки в Python? - PullRequest
6 голосов
/ 03 ноября 2011

У меня есть серия списков, которая выглядит следующим образом:

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']

Поддержание порядка после первого элемента не имеет значения.Спасибо за помощь.

Ответы [ 3 ]

5 голосов
/ 03 ноября 2011

Сортировка Python стабильна, поэтому вы будете поддерживать порядок после первого элемента независимо от этого.

li1.sort(key=lambda x: not x.startswith('b.'))
4 голосов
/ 03 ноября 2011

упорядочить элементы в каждом списке так, чтобы первый элемент был "b.something"

Поддержание порядка после первого элемента не имеет значения.

Это не сортировка.Концептуально, вы просто пытаетесь вывести этот элемент на передний план.

Другими словами, вам нужен список, состоящий из этого элемента, за которым следует все, что не является этим элементом.Немного обдумав это для случая, когда есть несколько b.something с, и отметив, что нам все равно, что произойдет, если первый элемент является b.something, мы можем перефразировать это: список каждого элемента, соответствующегоусловие («начинается с b.»), за которым следует каждый элемент, не соответствующий условию.(Это иногда называется разбиение ; см., Например, std::partition в C ++.)

В Python это так же просто, как описать эти два компонента списка со списками и объединить их вместе:

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

... Или вы можете делать вид, что сортируете, просто с помощью набора элементов, которые действительно имеют только два значения после применения key, и применять соответствующий key, как в ответе Игнасио Васкеса-Абрамса.

3 голосов
/ 03 ноября 2011

Вы можете использовать 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 возвращает отсортированный список и не изменяет ваш список. Оба работают одинаково.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...