Когда вы передаете lambda
в sort
, вам нужно вернуть целое число, а не логическое значение. Поэтому ваш код должен выглядеть следующим образом:
xs.sort(lambda x,y: cmp(len(x), len(y)))
Обратите внимание, что cmp - это встроенная функция, которая cmp(x, y)
возвращает -1, если x
меньше y
, 0, если x
равно y
, и 1, если x
больше y
.
Конечно, вы можете вместо этого использовать key
параметр:
xs.sort(key=lambda s: len(s))
Это говорит sort
методу о порядке на основе того, что возвращает функция ключа.
РЕДАКТИРОВАТЬ: Спасибо balpha и Руслану ниже за то, что они указали, что вы можете просто передать len
напрямую в качестве ключевого параметра функции, тем самым устраняя необходимость в lambda
:
xs.sort(key=len)
И, как Руслан указывает ниже, вы также можете использовать встроенную функцию сортировки, а не list.sort
метод, который создает новый список, а не сортирует существующий на месте:
print(sorted(xs, key=len))
lambda
; просто используйтеkey = len
xs.sort()
Бросает «TypeError: вид () не принимает никаких позиционных аргументов». Вместо этого должно бытьxs.sort(key=lambda x: len(x))
То же, что и в ответе Эли - просто используйте более короткую форму, потому что здесь вы можете пропустить
lambda
часть.Создание нового списка:
Сортировка по месту:
источник
xs.sort(key=len, reverse=True)
Я хотел бы добавить, как работает функция pythonic key при сортировке:
Шаблон дизайна "Украшать-Сортировка-Неукрашивать":
Поддержка Python ключевой функции при сортировке реализована с использованием так называемого шаблона проектирования декорировать-сортировать-недекорировать.
Это происходит в 3 этапа:
Каждый элемент списка временно заменяется «украшенной» версией, которая включает результат ключевой функции, примененной к элементу.
Список отсортирован на основе естественного порядка ключей.
Декорированные элементы заменены на оригинальные.
Ключевой параметр, чтобы указать функцию, которая будет вызываться для каждого элемента списка перед сравнением. документы
источник
Самый простой способ сделать это:
источник
Напишите функцию lensort для сортировки списка строк по длине.
источник
У меня это работает!
источник
Я могу сделать это, используя два следующих метода, используя функцию
В одном лайнере с использованием Lambda, как показано ниже, уже был дан ответ выше.
источник