Сортировка списка 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']
что может быть не так?
6 ответов:
при передаче
lambdaдоsort, вам необходимо вернуть целое число, а не логическое. Поэтому ваш код должен вместо этого читать следующим образом:xs.sort(lambda x,y: cmp(len(x), len(y)))отметим, что cmp является встроенной функцией, такой что
cmp(x, y)возвращает 1, Еслиxменьшеy, если 0xравнаy, и 1, Еслиxбольшеy.конечно, вы можете вместо этого использовать :
xs.sort(key = lambda s: len(s))это говорит
sortметод для заказа на основе того, что возвращает ключевая функция.EDIT: спасибо бальфе и Руслану ниже за указание, что вы можете просто пройти
lenсразу как ключевой параметр к функции, таким образом исключая потребность дляlambda:xs.sort(key = len)и как Руслан указывает ниже, вы также можете использовать встроенный отсортированный
то же самое, что и в ответе Эли - просто используя более короткую форму, потому что вы можете пропустить
lambdaздесь.создание нового списка:
>>> xs = ['dddd','a','bb','ccc'] >>> sorted(xs, key=len) ['a', 'bb', 'ccc', 'dddd']сортировка на месте:
>>> xs.sort(key=len) >>> xs ['a', 'bb', 'ccc', 'dddd']
Я хотел бы добавить, как работает функция pythonic key при сортировке:
Украсить-Сортировка-Undecorate Дизайн Шаблон:
поддержка Python для ключевой функции при сортировке реализуется с использованием того, что известно как украсить-сортировка-undecorate Дизайн Шаблон.
он продолжается в 3 этапа:
каждый элемент списка временно заменяется на "украшенную" версию, которая включает в себя результат ключевой функции, примененной к элементу.
список сортируется на основе естественного порядка ключей.
декорированные элементы заменяются оригинальными элементами.
ключевой параметр для указания функции, которая будет вызываться для каждого элемента списка перед выполнением сравнения. docs
напишите функцию 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"])
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это работает для меня!
Comments