Сортировка делегатов по условию - PullRequest
2 голосов
/ 31 марта 2012

У меня есть список объектов, которые предварительно отсортированы на основе некоторых сложных критериев, которые, например, нельзя легко скопировать с помощью attrgetter.Я хочу дополнительно отсортировать подмножество их по алфавиту, если они оба имеют свойство: part_of_subset.

Как мне сделать это без переопределения буквенной функции сортировки?

def cmp(a, b):
    if a.part_of_subset and b.part_of_subset:
        # sort alphabetically -- must I duplicate alphabetic sort code?
    return 0

Ответы [ 2 ]

4 голосов
/ 31 марта 2012

Хотя вы можете определить функцию сравнения для сортировки, обычно рекомендуется использовать ключевую функцию. Для вашего приложения эта ключевая функция должна возвращать то же значение для всего, что следует оставить нетронутым, и ключ сортировки для всего остального. Пример

def my_key(a):
    if a.part_of_subset:
        return 0,
    return 1, a.sort_key

collection.sort(key=my_key)

Обратите внимание, что отсортированное подмножество будет сгруппировано в один блок после уже отсортированных элементов.

Отредактировано : Чтобы избавиться от ограничения, что sort_key никогда не может быть None, и чтобы заставить код работать в Python 3, я обновил функцию ключа. Старая версия также могла привести к странным результатам в случае, когда ключи сортировки бывают разных типов (что не кажется слишком полезным, но в любом случае).

1 голос
/ 31 марта 2012

Вы можете делегировать сортировку другой функции при определенных условиях, просто сказав return cmp(a, b). Я имею в виду встроенную функцию Python cmp, а не вашу cmp.

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