2015-01-25 4 views
3

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

Пример:

#!/usr/local/bin/python2.7 
arr=['A','e','a','D','f','B'] 
arr.sort() 
for s in arr: print s 

Входной сигнал:

A 
e 
a 
D 
f 
B 

выход (ток):

A 
B 
D 
a 
e 
f 

Выход (должно быть):

a 
e 
f 
A 
B 
D 
+1

Обратите внимание, что все ответы до сих пор своего рода _letters_ (как в вашем примере), не _words_ (как в вашем вопросе). – georg

+0

Собственно, мои произносят слова, я просто не показывал их в своем примере. – SmeltQuake

+0

@georg Неверно. Все они сортируют слова. Сортировка по первому символу, затем по второму символу и т. Д., Вплоть до целого слова. Единственный вопрос здесь в том, что стандартная сортировка имеет другой индекс сортировки, чем то, что хочет OP. 'string.ascii_letters' имеет этот порядок. Любое решение, которое создает что-то промежуточное, устарело. – PascalVKooten

ответ

6

Используйте специальный метод ключа, который проверяет, не является ли элемент .lower(), а затем сравнивает сами элементы. Для 'A', 'D' и 'B'not x.islower() вернется True и для других это False как True > False мелких предметов случай наступит первым:

>>> arr = ['A','e','a','D','f','B'] 
>>> arr.sort(key=lambda x:(not x.islower(), x)) 
>>> arr 
['a', 'e', 'f', 'A', 'B', 'D'] 
+0

Странно он возвращает 'None' на меня – GLHF

+0

@howaboutNO Не присваивайте возвращаемое значение' arr.sort' переменной, оно сортирует список на месте. –

+0

Я думаю, что стоит упомянуть, что 'False skyline75489

3

Мы можем использовать string.ascii_letters, чтобы получить индекс каждой буквы, чтобы отсортировать их.

arr = ['A','e','a','D','f','B'] 

import string 

print sorted(arr, key=string.ascii_letters.index) 

Результаты:

['a', 'e', 'f', 'A', 'B', 'D'] 

Или, если вы хотите отсортировать исходный список arr использовать sort встроенную функцию.

arr.sort(key=string.ascii_letters.index) 
print arr 

Если arr список имеющих слова вместо отдельных букв или алфавитов мы можем использовать str.swapcase

arr = ['Abc', 'abc', 'aBc'] 
print sorted(arr, key=str.swapcase) 

Урожайность:

['abc', 'aBc', 'Abc'] 
+0

@PascalvKooten Спасибо за оценку. –

+1

лямбда-вызов избыточен, '.index' уже является вызываемым:' arr.sort (key = string.ascii_letters.index) '. –

+0

@AshwiniChaudhary Большое спасибо. Первоначально я пытался сортировать его по 'ord' и' lambda', поэтому он не фокусировался на этом. –

7

Чтобы отсортировать слова, а не просто буквы, просто замените футляр:

>>> words = ['alpha', 'Alpha', 'aLpha', 'Bravo', 'bRavo'] 
>>> sorted(words) 
['Alpha', 'Bravo', 'aLpha', 'alpha', 'bRavo'] 
>>> sorted(words, key=str.swapcase) 
['alpha', 'aLpha', 'bRavo', 'Alpha', 'Bravo'] 
+0

Я стою исправлено: это действительно лучший ответ (он единственный правильный). Это также очень красноречиво. Молодцы (по возможности меняют upvote). – PascalVKooten

+0

Это тот же ответ, что и вторая часть ответа Танвейера, и правильна и даже правильно сортирует несколько слов. Upvote. – polym

1

Некоторые тайминги показывают, что для сортировки отдельных символов Создание ДИКТ является фактически самым эффективным:

python2.7:

from string import ascii_letters 

d = {b:a for a, b in enumerate(ascii_letters)} 

In [34]: timeit sorted(s, key=str.swapcase) 
10 loops, best of 3: 32.6 ms per loop 

In [35]: timeit sorted(s,key=lambda x: (not x.islower(),x)) 
10 loops, best of 3: 51.4 ms per loop 

In [37]: timeit (sorted(s ,key=d.get)) 
10 loops, best of 3: 22.4 ms per loop 

Python3.4:

In [4]: timeit sorted(s,key=lambda x: (not x.islower(),x)) 
10 loops, best of 3: 57.7 ms per loop 

In [5]: timeit sorted(s, key=str.swapcase) 
10 loops, best of 3: 41.2 ms per loop 

In [6]: timeit (sorted(s ,key=d.get)) 
10 loops, best of 3: 21.1 ms per loop 
0

Дано: Буквенно-цифровая строка

Цель: сортировать по правилам

  1. Небольшие буквы сначала.
  2. Затем заглавными буквами.
  3. Затем цифры (даже первые, нечетные) (наименее приоритетные).

    def func(l): 
        if l.islower(): 
         return ord(l) - 32 
        elif l.isupper(): 
         return ord(l) + 32 
        elif l.isdigit(): 
         if int(l) % 2 == 0: 
          return ord(l) + 200 
         else: 
          return ord(l) + 100 
    
    print(*sorted(st, key=func), sep='') 
    
Смежные вопросы