Пользовательский список сортировки с использованием справочного заказа - PullRequest
1 голос
/ 10 января 2012

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

['AAA', 1, 2, -1]
['BB+', 3, 2, 1]
['AA-', 5, 4, 1]
['AA+', 4, 2, 2]

Как вы, наверное, видите, я бы хотел отсортировать по кредитным рейтингам. К сожалению, простая сортировка с использованием встроенных функций не обеспечивает правильный порядок. Я хотел бы как-то указать порядок, например:

correct_order = ['AAA', 'AA+',...,'BBB+', 'BBB', 'BB+',...]

Я могу представить, что есть бесчисленное множество способов сделать это, возможно, без указания этого. Я не беспокоюсь о производительности, так как никогда не буду работать с более чем 22 строками.

Один важный момент, который следует подчеркнуть, заключается в том, что сортировка будет основываться на индексе 0 в каждой строке, но с сохранением остальной части массива. Кроме того, нет гарантии, что массив будет содержать каждый «рейтинг» в списке correct_order.

Я видел похожие проблемы, объясненные на форуме, но не смог адаптировать их к моему набору данных. Любая помощь с самым простым решением будет принята с благодарностью.

Ответы [ 2 ]

3 голосов
/ 10 января 2012

В качестве ключа вы можете использовать индекс строки рейтинга в списке правильно отсортированных строк рейтинга:

>>> correct_order = ['AAA', 'AA+', 'BBB+', 'BBB', 'BB+']
>>> list(sorted("BBB BBB+ BB+ AAA AA+ BBB+ BBB AA+".split(), key=lambda s:correct_order.index(s)))
['AAA', 'AA+', 'AA+', 'BBB+', 'BBB+', 'BBB', 'BBB', 'BB+']

Адаптация к вашему конкретному набору данных (где строка рейтинга находится в первом элементе каждого списка в списке списков):

correct_order = ['AAA', 'AA+',...,'BBB+', 'BBB', 'BB+',...]
the_lists.sort(key=lambda l: correct_order.index(l[0]))
2 голосов
/ 10 января 2012

Ответ Клавдия достаточно хорош.Мое это незначительное изменение.Предположительно, диктат lookup даст немного более высокую производительность, если список correct_order большой.

    the_lists = [['AAA', 1, 2, -1],
        ['AA-', 5, 4, 1],
        ['BB+', 3, 2, 1],
        ['AA+', 4, 2, 2]]

    correct_order = ['AAA', 'AA+', 'AA-', 'BBB+', 'BBB', 'BB+']
    lookup = dict([(y, x) for (x, y) in enumerate(correct_order)])
    the_lists.sort(key=lambda l: lookup[l[0]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...