Сортированный по длине список, но такой же длины в алфавитном порядке на этапе

Мой Python Список строк – это что-то вроде x но достаточно долго:

 x = ['aaa','ab','aa','c','a','b','ba'] 

Я хочу отсортировать этот список как: ['a', 'b', 'c', 'aa', 'ab', 'ba', 'aaa'] и я сделал следующее в два этапа:

 >>> x.sort() >>> x.sort(key=len) >>> x ['a', 'b', 'c', 'aa', 'ab', 'ba', 'aaa'] 

Но мне нужно в один шаг: я также связал с помощью lambda функции ( принята помощь ):

 >>> x.sort(key=lambda item: (item, len(item))) >>> x ['a', 'aa', 'aaa', 'ab', 'b', 'ba', 'c'] 

Но не так, как я хотел:

Возможно ли это в один шаг? Пожалуйста, мне.

Мой Python:

 ~$ python --version Python 2.6.6 

  • Чтение / запись подпроцесса Popen ()
  • Ошибка связи SQLAlchemy: у объекта нет атрибута 'c'
  • Простой пример использования ast.NodeVisitor?
  • Ошибка установки пакета python pip, ошибка dllwrap после «исправления»: «невозможно найти vcvarsall.bat»
  • Разбор XML в Python
  • Python 2.6 ImportError: нет модуля с именем argparse
  • Создание кода Python 2.7 с помощью Python 2.6
  • bash: pip: команда не найдена
  • 2 Solutions collect form web for “Сортированный по длине список, но такой же длины в алфавитном порядке на этапе”

    У вас есть порядок кортежа неправильным образом. Когда Python сортирует по кортежам, первым значением является основной вид, второй – подсекция и т. Д. – ваш код предполагает противоположный порядок.

    Вы хотите отсортировать по длине, затем по алфавиту:

     >>> x.sort(key=lambda item: (len(item), item)) >>> x ['a', 'b', 'c', 'aa', 'ab', 'ba', 'aaa'] 

    Изменить: Как указывает DSM в комментариях, Python сортирует буквы сначала как капители, затем строчные. Если это поведение не требуется, см. Этот ответ .

    используя itertools.grouby() :

     In [29]: lis = ['aaa','ab','aa','c','a','b','ba'] In [30]: list(chain(*[sorted(g) for k,g in groupby(sorted(lis,key=len),key=len)])) Out[30]: ['a', 'b', 'c', 'aa', 'ab', 'ba', 'aaa'] 

    сравнение времени:

     In [38]: x = ['aaa','ab','aa','c','a','b','ba']*1000 In [39]: random.shuffle(x) #may be in more tricky test cases this would be fast In [40]: %timeit sorted(x,key=lambda item: (len(item), item)) 100 loops, best of 3: 11.3 ms per loop In [41]: %timeit list(chain(*[sorted(g) for k,g in groupby(sorted(x,key=len),key=len)])) 100 loops, best of 3: 7.82 ms per loop 
    Python - лучший язык программирования в мире.