Сортировка списка строк, игнорирующих верхний / нижний регистр
у меня есть список, который содержит строки, представляющие имена животных. Мне нужно отсортировать список. Если я использую 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, я хотел бы добавить два пункта:
- использовать
str.casefold
для сравнения без учета регистра. - используйте метод непосредственно вместо внутренней части лямбды.
что есть:
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']