2013-05-16 3 views
6

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

l = ['a', 'b', 'B', 'A'] 

sorted(l) должно привести к ['A','a','B','b']

Я пробовал эти две формы, но безрезультатно;

>>> sorted(l, key=lambda s: s.lower()) 
['a', 'A', 'b', 'B'] 
>>> sorted(l, key=str.lower) 
['a', 'A', 'b', 'B'] 

ответ

9

Создать кортеж в качестве ключа вместо:

>>> sorted(lst, key=lambda L: (L.lower(), L)) 
['A', 'a', 'B', 'b'] 

Это означает, что порядок сортировки для нижнего регистра не изменяется ('a', 'a'), но означает, что первый ключ для верхнего регистра ставит его вровень с нижним -случае эквивалент, затем сортирует перед ним: например ('a', 'A') < ('a', 'a')

+0

идеальным решением. Извините за мой предыдущий комментарий :) –

+0

Если у вас есть неанглийские строки, будьте очень осторожны с методами, которые полагаются на использование '.lower()' для нечувствительной к регистру сортировки, они работают только для подмножества символов ASCII. Правильный способ включает в себя немного возиться с языковыми настройками. – wim

+0

Например, это решение не работает для 'lst = ['á', 'b', 'B', 'Á']' на python 2 (возможно, это будет на python3) – wim

3

Интересно, как такой список должен сортировать следующий список

lst = ['abb', 'ABB', 'aBa', 'AbA'] 

Предлагаемая продукция раствора следующего результата

>>> sorted(lst, key=lambda L: (L.lower(), L)) 
['AbA', 'aBa', 'ABB', 'abb'] 

может предложить более сложное решение с другим результатом

>>> sorted(lst, key=lambda a: sum(([a[:i].lower(), 
            a[:i]] for i in range(1, len(a)+1)),[])) 
['ABB', 'AbA', 'aBa', 'abb'] 
+0

Хорошая идея, но выражение может быть проще - как насчет '[ord (x) + 31.5 * x.isupper() для x в a] '? – georg

Смежные вопросы