вид Python без лямбда-выражений

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

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

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

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

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

Существует ли хороший способ сделать это, не используя лямбду?

7
задан PaulMcG 4 August 2010 в 16:24
поделиться

4 ответа

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

>>> x = [12, 101, 4, 56]
>>> y = range(len(x))
>>> sorted(y, key=x.__getitem__)
[2, 0, 3, 1]
12
ответ дан 6 December 2019 в 08:41
поделиться

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

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

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

0
ответ дан 6 December 2019 в 08:41
поделиться

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

def sort_key(value):
    return x[value]

y.sort(key = sort_key)

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

3
ответ дан 6 December 2019 в 08:41
поделиться

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

[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))]
6
ответ дан 6 December 2019 в 08:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: