У меня есть функция в python, которая возвращает кортеж заданного ключа для алгоритма Natural-Sort / Human.
См. fake _human_key .
Но янужно это изменить, чтобы заменить немецкие умлауты их стандартными алфавитными символами.
Короче говоря, я хочу избавиться от Ä, Ö, Ü, ß
для сортировки.
Кроме того, случай должен не .Маленький d
должен иметь тот же приоритет, что и заглавный D
...
Для умлаутов я использую функцию замены, которая кажется довольно неловким способом сделать это ...: - /Понятия не имею ... Есть предложения?
Также я не могу переписать это, чтобы избавиться от чувствительности к регистру ...
Пока у меня есть:
def _human_key(key):
key = key.replace("Ä", "A").replace("Ö", "O").replace("Ü", "U")\
.replace("ä", "a").replace("ö", "o").replace("ü", "u")\
.replace("ß", "s")
parts = re.split(r'(\d*\.\d+|\d+)', key)
return tuple((e.swapcase() if i % 2 == 0 else float(e))
for i, e in enumerate(parts))
return parts
Примеры: у меня есть значения
Zabel
Schneider
anabel
Arachno
Öztürk
de 'Hahn
, которые я хочу отсортировать;в настоящее время это ставит:
anabel
de 'Hahn
Arachno
Öztürk
Schneider
Zabel
, потому что маленькие символы обрабатываются с приоритетом ...
Ожидание:
anabel
Arachno
de 'Hahn ( <-- because "d" comes after "a")
Öztürk
Schneider
Я считаю, что замена не является правильным способомчтобы решить проблему с умляутами, но не могу найти лучшего решения.
Обновление / Справочная информация:
Я звоню это извне, из класса "QSortFilterProxyModel", мне нужноэто для сортировки строк по их нажатым столбцам.У меня есть QTreeView, который отображает набор результатов из базы данных, и один столбец содержит немецкие фамилии, это фон.
class HumanProxyModel(QtCore.QSortFilterProxyModel):
def lessThan(self, source_left, source_right):
data_left = source_left.data()
data_right = source_right.data()
if type(data_left) == type(data_right) == str:
return _human_key(data_left) < _human_key(data_right)
return super(HumanProxyModel, self).lessThan(source_left, source_right)