@pcdesign

Как подчинить сортировку с буквой Ё и с itemgetter?

from operator import itemgetter 

a = [{'src': 'Яблоко', 'dst': 2343}, {'src': 'Ананас', 'dst': 323}, {'src': 'Ёжик', 'dst':3223}]
a.sort(key=itemgetter('src'))


Результат:

Ёжик
Ананас
Яблоко


Версия: Python 3.4.6
  • Вопрос задан
  • 1488 просмотров
Решения вопроса 1
adugin
@adugin Куратор тега Python
Формальный говнокод для решения проблемы буквы Ё (концепт):
key = lambda c: ord('Е') + 0.5 if c == 'Ё' else ord(c)

Правильный путь:
import locale
from functools import cmp_to_key
from collections import OrderedDict

locale.setlocale(locale.LC_ALL, 'Russian_Russia.1251')

a = [{'src': 'Яблоко', 'dst': 2343}, {'src': 'Ананас', 'dst': 323}, {'src': 'Ёжик', 'dst': 3223}]

# Чтобы не вызывать связку cmp_to_key(locale.strcoll) в sorted() многократно
def keyfunc(item, func=cmp_to_key(locale.strcoll)):
    return func(item[0])

d = OrderedDict(sorted(((e['src'], e['dst']) for e in a), key=keyfunc))

Если всё же требуется именно список словарей:
# Чтобы не вызывать связку cmp_to_key(locale.strcoll) в sorted() многократно
def keyfunc(item, func=cmp_to_key(locale.strcoll)):
    return func(item['src'])

sorted(a, key=keyfunc)

Но самое адекватное решение будет таким (для работы: pip install sortedcontainers):
from sortedcontainers import SortedDict
d = SortedDict(cmp_to_key(locale.strcoll), {e['src']:e['dst'] for e in a})

Примечания:
1. Если можете использовать последнюю версию Python, то начиная с версии 3.6 порядок элементов в словаре не меняется, то есть его можно создать сразу сортированным и работать без опасений.
2. Модуль sortedcontainers по быстродействию и удобству оставляет позади все существующие альтернативные библиотеки, включая стандартную collections. Очень рекомендую.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
aRegius
@aRegius
Python Enthusiast
Попробуйте просто по индексу в общем алфавитном списке:
>>> words = [{'src': 'Ананас', 'dst': 323}, {'src': 'Ёжик', 'dst': 3223}, {'src': 'Яблоко', 'dst': 2343}, {'src': 'Hi', 'dst': 78768}]
>>> eng_rus_upper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ'

>>> res = sorted(words, key=lambda x: eng_rus_upper.index(x['src'][0]))
>>> res
[{'src': 'Hi', 'dst': 78768}, {'src': 'Ананас', 'dst': 323}, {'src': 'Ёжик', 'dst': 3223}, {'src': 'Яблоко', 'dst': 2343}]
>>>
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы