Сортировка списка Python по длине строки - PullRequest
85 голосов
/ 06 апреля 2010

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

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 ]

168 голосов
/ 06 апреля 2010

Когда вы передаете 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: Спасибо Бальфе и Руслану ниже за то, что они указали, что вы можете просто передать len непосредственно в качестве ключевого параметра функции, тем самым устраняя необходимость в lambda:

xs.sort(key = len)

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

print sorted(xs, key=len)
77 голосов
/ 06 апреля 2010

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

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

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

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

>>> xs.sort(key=len)
>>> xs
['a', 'bb', 'ccc', 'dddd']
4 голосов
/ 23 ноября 2013

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

Украсить-Сортировать-Декорировать Шаблон дизайна:

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

Выполняется в 3 этапа:

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

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

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

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

2 голосов
/ 31 марта 2016

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

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

1 голос
/ 04 августа 2015

Напишите функцию 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 голосов
/ 06 сентября 2015
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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...