Сортировка списка 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 этапа:
Каждый элемент списка временно заменяется "оформленной" версией, которая включает результат применения функции ключа к элементу.
Список отсортирован в соответствии с естественным порядком клавиш.
Декорированные элементы заменены оригинальными элементами.
Ключевой параметр, чтобы указать функцию, которая будет вызываться в каждом элементе списка перед сравнением. документы
Ответ 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)