как отсортировать по длине строки с последующим алфавитным порядком? - PullRequest
57 голосов
/ 11 января 2011

В настоящее время я новичок в python и застрял в этом вопросе, похоже, не могу найти правильный ответ.

вопрос: Получив список слов, верните список с теми же словами по порядкудлины (от самой длинной до самой короткой), второй критерий сортировки должен быть в алфавитном порядке.Подсказка: вам нужно подумать о двух функциях.

Это то, что я имею до сих пор:

def bylength(word1,word2):
    return len(word2)-len(word1)

def sortlist(a):
    a.sort(cmp=bylength)
    return a

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

Ответы [ 4 ]

119 голосов
/ 11 января 2011

Вы можете сделать это в два этапа, например:

the_list.sort() # sorts normally by alphabetical order
the_list.sort(key=len, reverse=True) # sorts by descending length

Сортировка Python стабильна, что означает, что сортировка списка по длине оставляет элементы в алфавитном порядке, когда длина равна.

Вы также можете сделать это так:

the_list.sort(key=lambda item: (-len(item), item))

Как правило, вам никогда не понадобится cmp, он даже был удален в Python3. key гораздо проще в использовании.

5 голосов
/ 15 апреля 2014
n = ['aaa', 'bbb', 'ccc', 'dddd', 'dddl', 'yyyyy']

for i in reversed(sorted(n, key=len)):
    print i

ггггг дддл дддк ccc bbb ааа

for i in sorted(n, key=len, reverse=True):
     print i

ггггг дддддд ааа bbb ccc

2 голосов
/ 15 июня 2015
-Sort your list by alpha order, then by length.

See the following exmple:

>>> coursesList = ["chemistry","physics","mathematics","art"]
>>> sorted(coursesList,key=len)
['art', 'physics', 'chemistry', 'mathematics']
>>> coursesList.append("mopsosa")
>>> sorted(coursesList,key=len)
['art', 'physics', 'mopsosa', 'chemistry', 'mathematics']
>>> coursesList.sort()
>>> sorted(coursesList,key=len)
['art', 'mopsosa', 'physics', 'chemistry', 'mathematics']
0 голосов
/ 23 мая 2018

Хотя Йохен Ритцель сказал, что вам не нужен cmp, на самом деле это отличный вариант использования! Используя cmp, вы можете сортировать по длине, а затем по алфавиту в два раза быстрее, чем в два раза быстрее!

def cmp_func(a, b):
    # sort by length and then alphabetically in lowercase
    if len(a) == len(b):
        return cmp(a, b)
    return cmp(len(a), len(b))

sorted_the_way_you_want = sorted(the_list, cmp=cmp_func)

Пример:

>>> the_list = ['B', 'BB', 'AA', 'A', 'Z', 'C', 'D']
>>> sorted(the_list, cmp=cmp_func)
['A', 'B', 'C', 'D', 'Z', 'AA', 'BB']

Обратите внимание, если ваш список представляет собой сочетание верхнего и нижнего регистра, замените cmp(a, b) на cmp(a.lower(), b.lower()) , так как python сортирует 'a'> 'Z' .

В python3 вам нужно будет сортировать объекты с определенными функциями сравнения стиля __lt__ или functools.cmp_to_key() , который сделает это за вас.

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