сортировка по python без лямбда-выражений - PullRequest
7 голосов
/ 04 августа 2010

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

У меня есть список номеров, например, x = [12, 101, 4, 56, ...]

У меня есть отдельный список показателей: y = range(len(x))

Я хочу отсортировать y на основе значений в x, и я делаю это:

y.sort(key=lambda a: x[a])

Есть ли хороший способ сделать это без использования лямбды?

Ответы [ 4 ]

12 голосов
/ 04 августа 2010

Вы можете использовать __getitem__ метод списка x.Это ведет себя так же, как ваша лямбда и будет намного быстрее, так как она реализована как функция C вместо функции python:

>>> x = [12, 101, 4, 56]
>>> y = range(len(x))
>>> sorted(y, key=x.__getitem__)
[2, 0, 3, 1]
6 голосов
/ 04 августа 2010

Не элегантно, но:

[a for (v, a) in sorted((x[a], a) for a in y)]

Кстати, вы можете сделать это без создания отдельного списка индексов:

[i for (v, i) in sorted((v, i) for (i, v) in enumerate(x))]
3 голосов
/ 04 августа 2010

Я не уверен, что этот тип альтернативы вы имели в виду, но вы можете определить ключевую функцию с помощью def:

def sort_key(value):
    return x[value]

y.sort(key = sort_key)

Лично я думаю, что это хуже, чем lambda, поскольку он перемещает критерии сортировки от строки кода, выполняющей сортировку, и без необходимости добавляет функцию sort_key в ваше пространство имен.

0 голосов
/ 04 августа 2010

Полагаю, если бы я хотел создать другую функцию, я мог бы сделать что-то вроде этого (не проверено):

def sortUsingList(indices, values):
    return indices[:].sort(key=lambda a: values[a])

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

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