Я использую функцию attrgetter
из модуля operator
Python 3 для сортировки списка объектов (попаданий).Каждый объект имеет 12 атрибутов, и моя функция сортировки может быть передана любым из них, чтобы отсортировать список любым необходимым способом.Атрибуты, которые я заинтересован в сортировке, содержат строки.Вот соответствующий фрагмент из моего кода.
from operator import attrgetter
...
def sort_hits_by_attribute(hits, attribute, backwards = False):
"""Takes a lits of hits and sorts them by some attribute.
"""
return sorted(hits, key = attrgetter(attribute), reverse = backwards)
Вот пример объекта "попадания" с его атрибутами.
name: ...
entity_1: coffee cultivation
entity_2: ...
full_statement: ...
category: ...
rule: ...
syn_configs: ...
lex_conditions: ...
sentence_number: ...
close_call: False
message: ...
id: 119
Если я сортирую свой список объектов поатрибут entity_1
, затем указанный выше объект сортируется после экземпляра, поле которого entity_1
начинается с заглавной буквы: например, «Кофе» или даже «Зоопарк».
Я хотел бы использовать функцию, похожую на casefold()
, чтобы буквы в верхнем регистре сортировались рядом с аналогами в нижнем регистре и после них.Однако casefold()
действителен только для строк, поэтому использование key = attrgetter(attribute).casefold()
возвращает ошибку AttributeError.
Как сохранить функциональность sort_hits_by_attribute()
- т.е. сортировку по атрибуту, переданному во время вызова функции -но заставлять Python использовать другой порядок {aAbBcCdDeE ...} при этом?