Сортування списку 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спосіб замовлення на основі того, що повертається ключова функція.

EDIT: Завдяки balpha та Руслану нижче за те, що вони вказали, що ви можете просто передати lenбезпосередньо як основний параметр функції, тим самим усуваючи необхідність у lambda:

xs.sort(key=len)

І як вказує Руслан нижче, ви також можете використовувати вбудовану впорядковану функцію, а не list.sortметод, який створює новий список, а не сортування існуючого на місці:

print(sorted(xs, key=len))

32
Не потрібно lambda; просто використовуйтеkey = len
balpha

15
Це буде сортувати у порядку зростання (менша довжина слів у верхній частині), для сортування у порядку зменшення (менша довжина слів внизу) додавання параметра зворотного = True
Ajay Gupta

xs.sort()Кидає «TypeError: вид () не приймає ніяких позиційних аргументів». Натомість має бутиxs.sort(key=lambda x: len(x))
Привіт-Ангел

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
Як змінити сортування за довжиною?
користувач2922935

1
@ user2922935: Ви можете зробити xs [:: - 1], щоб змінити вже відсортований список. Перегляньте статтю Дена Бадера тут: dbader.org/blog/python-reverse-list
Thyag

7
xs.sort(key=len, reverse=True)
Раз

5

Я хотів би додати, як функція пітонічного ключа працює під час сортування:

Візерунок дизайну «Сортувати-Сортувати»

Підтримка Python для ключової функції при сортуванні реалізується з використанням того, що відомо як шаблон дизайну decorate-sor-undecorate.

Це відбувається в 3 етапи:

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

  2. Список сортується на основі природного порядку клавіш.

  3. Оформлені елементи замінюються оригінальними елементами.

Основний параметр, щоб вказати функцію, яку потрібно викликати на кожному елементі списку перед порівнянням. док


4

Найпростіший спосіб це зробити:

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


1

Напишіть функціональний об'єктив для сортування списку рядків за довжиною.

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.