Сортировка списка Python по длине строки

110

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

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

Что может быть не так?

prosseek
источник

Ответы:

201

Когда вы передаете 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))
Эли Кортрайт
источник
32
Нет необходимости в lambda; просто используйтеkey = len
balpha 06
15
Это будет отсортировать в возрастающем порядке (меньшая длина слов вверху), для сортировки в убывающем порядке (меньшая длина слов внизу) добавит параметр reverse = True
Аджай Гупта
xs.sort()Бросает «TypeError: вид () не принимает никаких позиционных аргументов». Вместо этого должно бытьxs.sort(key=lambda x: len(x))
Hi-Angel
84

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

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

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

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

>>> xs.sort(key=len)
>>> xs
['a', 'bb', 'ccc', 'dddd']
Руслан Спивак
источник
5
Как сделать обратную сортировку по длине?
user2922935 03
1
@ user2922935: Вы можете выполнить xs [:: - 1], чтобы перевернуть уже отсортированный список. Ознакомьтесь со статьей Дэна Бадера здесь: dbader.org/blog/python-reverse-list
Thyag,
7
xs.sort(key=len, reverse=True)
Raz
5

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

Шаблон дизайна "Украшать-Сортировка-Неукрашивать":

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

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

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

  2. Список отсортирован на основе естественного порядка ключей.

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

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

Джеймс Сапам
источник
4

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

list.sort (ключ = лямбда x: len (x))

Чираг Патель
источник
1

Напишите функцию 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"])
Фебин Стивен
источник
0
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

У меня это работает!

Саураб Ариян
источник
0

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

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

В одном лайнере с использованием Lambda, как показано ниже, уже был дан ответ выше.

 lista = ['a', 'bb', 'ccc', 'dddd']
 lista.sort(key = lambda x:len(x))
 print(lista)
Аашутош
источник