Сортировка списка Python в зависимости от длины строки

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

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']

Что может быть неправильным?

Ответ 1

Когда вы передаете 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 для заказа на основе того, что возвращает функция ключа.

EDIT: Спасибо balpha и Ruslan ниже, указав, что вы можете просто передать len непосредственно в качестве ключевого параметра функции, тем самым устраняя необходимость в lambda:

xs.sort(key = len)

И как указывает Руслан, вы также можете использовать встроенную функцию sorted, а не метод list.sort, который создает новый список, а не сортирует существующее на месте:

print sorted(xs, key=len)

Ответ 2

То же, что и в ответе Эли - просто используйте более короткую форму, потому что вы можете пропустить здесь часть lambda.

Создание нового списка:

>>> xs = ['dddd','a','bb','ccc']
>>> sorted(xs, key=len)
['a', 'bb', 'ccc', 'dddd']

Сортировка места:

>>> xs.sort(key=len)
>>> xs
['a', 'bb', 'ccc', 'dddd']

Ответ 3

Я хотел бы добавить, как работает функция pythonic key при сортировке:

Шаблон оформления декорации, сортировки и декорации:

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

Это происходит в 3 этапа:

  1. Каждый элемент списка временно заменяется "оформленной" версией, которая включает результат применения функции ключа к элементу.

  2. Список отсортирован в соответствии с естественным порядком клавиш.

  3. Декорированные элементы заменены оригинальными элементами.

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

Ответ 4

Самый простой способ сделать это:

list.sort(key = lambda x: len (x))

Ответ 5

Напишите функцию lensort для сортировки списка строк по длине.

def lensort(a):
    n = len(a)
    for i in range(n):
        for j in range(i+1,n):
            if len(a[i]) > len(a[j]):
                temp = a[i]
                a[i] = a[j]
                a[j] = temp
    return a
print lensort(["hello","bye","good"])

Ответ 6

def lensort(list_1):
    list_2=[];list_3=[]
for i in list_1:
    list_2.append([i,len(i)])
list_2.sort(key = lambda x : x[1])
for i in list_2:
    list_3.append(i[0])
return list_3

Это работает для меня!

Ответ 7

Я могу сделать это, используя ниже два метода, используя функцию

def lensort(x):
    list1 = []
    for i in x:
        list1.append([len(i),i])
    return sorted(list1)

lista = ['a', 'bb', 'ccc', 'dddd']
a=lensort(lista)
print([l[1] for l in a])

В одном вкладыше, использующем лямбду, как показано ниже, ответ уже дан выше.

 lista = ['a', 'bb', 'ccc', 'dddd']
 lista.sort(key = lambda x:len(x))
 print(lista)