Сначала сортируйте массив строк по длине, затем в алфавитном порядке в Python 3

Как отсортировать массив в python во-первых по длине слов (от самого длинного до кратчайшего), а затем по алфавиту?

Вот что я имею в виду:

У меня есть этот список: WordsArray = ["Lorem", "ipsum", "dolor", "sit", "amet", "consectetur", "adipiscing", "elit", "sed", "do", "eiusmod", "tempor", "incididunt"]

Я хочу вывести это: ['consectetur', 'adipiscing', 'incididunt', 'eiusmod', 'tempor', 'dolor', 'ipsum', 'Lorem', 'amet', 'elit', 'sed', 'sit', 'do']

Я уже сортирую в алфавитном порядке с помощью print (sorted(WordsArray)) :

 ['Lorem', 'adipiscing', 'amet', 'consectetur', 'do', 'dolor', 'eiusmod', 'elit', 'incididunt', 'ipsum', 'sed', 'sit', 'tempor'] 

Во-первых, использование только что sorted не будет сортироваться в алфавитном порядке , посмотрите на свой результат … Я уверен, что L не приходит раньше. То, что вы сейчас делаете, относится к регистру .

Вы можете выполнить сортировку без учета регистра с помощью ключевой функции, например:

 >>> words_list = ["Lorem", "ipsum", "dolor", "sit", "amet", "consectetur", "adipiscing", "elit", "sed", "do", "eiusmod", "tempor", "incididunt"] >>> sorted(words_list, key=str.lower) ['adipiscing', 'amet', 'consectetur', 'do', 'dolor', 'eiusmod', 'elit', 'incididunt', 'ipsum', 'Lorem', 'sed', 'sit', 'tempor'] 

Затем вы можете изменить функцию клавиш, как показано ниже, для сортировки сначала по длине, а затем по алфавиту:

 >>> def custom_key(str): ... return -len(str), str.lower() ... >>> sorted(words_list, key=custom_key) ['consectetur', 'adipiscing', 'incididunt', 'eiusmod', 'tempor', 'dolor', 'ipsum', 'Lorem', 'amet', 'elit', 'sed', 'sit', 'do'] 

Вы можете использовать в качестве ключа кортеж, который сначала определяет отрицательную длину строки -len(x) а затем сам x :

 sorted(WordsArray , key=lambda x: (-len(x),x) ) 

Так как кортежи сортируются по первому элементу, и в случае ex aequo вторым элементом и так далее, мы сначала сравниваем по -len(x) двух строк, так что это означает, что сначала сортируется большая строка.

В случае, если обе строки имеют одинаковую длину, мы сравниваем по x , поэтому в алфавитном порядке.

Имейте в виду, что сортировка двух строк чувствительна к регистру : Python сортирует их лексикографически, но где порядок задается ord(..) первых символов и т. Д. Если вы хотите упорядочить по алфавиту, лучше преобразовать верхний регистр и регистр нижнего регистра в в том же случае. Быстрый способ справиться с этим:

 sorted(WordsArray, key=lambda x: (-len(x),x. lower() )) 

Но это не всегда правильно : поскольку, например, est-zet на немецком языке иногда переводится на ss и т. Д. Фактически сортировка по алфавиту является очень сложной проблемой на некоторых языках. Поэтому в этом случае вам нужно указать сортировку .