Сортировка списка 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']

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

Ответы:


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. Декорированные элементы заменены на оригинальные.

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



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)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.