Я хочу отсортировать список строк на основе длины строки. Я пытался использовать вид следующим образом, но это, кажется, не дает мне корректный результат.
xs = ['dddd','a','bb','ccc']
print xs
xs.sort(lambda x,y: len(x) < len(y))
print xs
['dddd', 'a', 'bb', 'ccc']
['dddd', 'a', 'bb', 'ccc']
Что могло бы быть неправильным?
Когда вы передаете лямбда
в 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
напрямую в качестве ключевого параметра функции, тем самым устраняя необходимость в лямбда
:
xs.sort(key = len)
И, как Руслан указывает ниже, вы также можете использовать встроенную функцию sorted вместо метода list.sort
, который создает новый список, а не сортирует существующий. на месте:
print sorted(xs, key=len)
То же, что и в ответе Эли - только в более короткой форме, потому что здесь вы можете пропустить часть лямбда
.
Создание нового списка:
>>> xs = ['dddd','a','bb','ccc']
>>> sorted(xs, key=len)
['a', 'bb', 'ccc', 'dddd']
Сортировка по месту:
>>> xs.sort(key=len)
>>> xs
['a', 'bb', 'ccc', 'dddd']