Я часто делаю виды в Python с помощью лямбда-выражений, и хотя он хорошо работает, я нахожу его не очень читаемым, и надеялся, что мог бы быть лучший путь. Вот типичный вариант использования для меня.
У меня есть список чисел, например, x = [12, 101, 4, 56, ...]
У меня есть отдельный список индексов: y = range(len(x))
Я хочу отсортировать y
на основе значений в x
, и я делаю это:
y.sort(key=lambda a: x[a])
Существует ли хороший способ сделать это, не используя лямбду?
Вы можете использовать метод __ getitem __
списка x. Это ведет себя так же, как ваша лямбда, и будет намного быстрее, поскольку оно реализовано как функция C вместо функции python:
>>> x = [12, 101, 4, 56]
>>> y = range(len(x))
>>> sorted(y, key=x.__getitem__)
[2, 0, 3, 1]
Полагаю, если бы я хотел создать другую функцию, я мог бы сделать это примерно так (не тестировалось):
def sortUsingList(indices, values):
return indices[:].sort(key=lambda a: values[a])
Хотя я думаю, что предпочитаю использовать лямбда, чтобы избежать необходимости создавать дополнительная функция.
Я не уверен, что вы имели в виду именно такую альтернативу, но вы можете определить ключевую функцию с помощью def
:
def sort_key(value):
return x[value]
y.sort(key = sort_key)
Лично я думаю, что это хуже, чем лямбда
, поскольку она перемещает критерии сортировки из строки кода, выполняющей сортировку, и без необходимости добавляет функцию sort_key
в ваше пространство имен.
Не элегантно, но:
[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))]