Сортировка списка строк, игнорирующих верхний / нижний регистр

у меня есть список, который содержит строки, представляющие имена животных. Мне нужно отсортировать список. Если я использую sorted(list), Он даст вывод списка с строками верхнего регистра сначала, а затем в нижнем регистре.

но мне нужен следующий вывод.

вход:

var = ['ant','bat','cat','Bat','Lion','Goat','Cat','Ant']

выход:

['ant', 'Ant', 'bat', 'Bat', 'cat', 'Cat', 'Goat', 'Lion']

3 ответов


на sort() способ и sorted() функция принимает ключевой аргумент:

var.sort(key=lambda v: v.upper())

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

>>> var=['ant','bat','cat','Bat','Lion','Goat','Cat','Ant']
>>> sorted(var, key=lambda v: v.upper())
['ant', 'Ant', 'bat', 'Bat', 'cat', 'Cat', 'Goat', 'Lion']

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

>>> sorted(var, key=lambda v: (v.upper(), v[0].islower()))
['Ant', 'ant', 'Bat', 'bat', 'Cat', 'cat', 'Goat', 'Lion']

более сложный ключ генерирует ('ANT', False) для Ant и ('ANT', True) на ant; True сортируется после False и поэтому прописные слова сортируются перед их строчным эквивалентом.

посмотреть Python сортировка HOWTO для получения дополнительной информации.


новый ответ для Python 3, я хотел бы добавить два пункта:

  1. использовать str.casefold для сравнения без учета регистра.
  2. используйте метод непосредственно вместо внутренней части лямбды.

что есть:

var = ['ant','bat','cat','Bat','Lion','Goat','Cat','Ant']

var.sort(key=str.casefold)

(который сортирует на месте) а теперь:

>>> var
['ant', 'Ant', 'bat', 'Bat', 'cat', 'Cat', 'Goat', 'Lion']

или, чтобы вернуть новый список, используйте sorted

>>> var = ['ant','bat','cat','Bat','Lion','Goat','Cat','Ant']
>>> sorted(var, key=str.casefold)
['ant', 'Ant', 'bat', 'Bat', 'cat', 'Cat', 'Goat', 'Lion']

почему это отличается от str.lower или str.upper? по данным документация:

Casefolding похож на нижний регистр, но более агрессивный, потому что он предназначен для удаления всех различий в регистре в строке. Например, немецкая строчная буква 'ß' эквивалентно "ss". Так как это уже строчные буквы,str.lower() не будут 'ß'; casefold() преобразует его в "ss".


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

a = sorted(Input, key=str.lower)print("Output1: ",a)

Выход1:

['ant', 'Ant', 'bat', 'Bat', 'cat', 'Cat', 'Goat', 'Lion']