3

Имеется список словарей следующего содержания.

guys_json = [
       {
         "id": 3, 
         "full_name": "Ффффф", 
         "post": "Водитель", 
         "image": "xxx.jpg"},     
       {
         "id": 20, 
         "full_name": "Рррр", 
         "post": "Повар", 
         "image": "yyy.jpg"}, 
       {
         "id": 11, 
         "full_name": "Аааа", 
         "post": "Директор", 
         "image": "tre.jpg"},
       ....]

Необходимо отсортировать его в алфавитном порядке средствами python по полю 'full name' и раскидать объекты в категории по буквам кириллического алфавита ("А", "Б"... "Я"). Подскажите, пожалуйста, с какой стороны подойти к решению

while1pass
  • 2,265

2 Answers2

5

Данные в вопросе не являются JSON объектом, например, json.loads() выкинет ошибку.

Если интерпертировать данные как исходный код Питона, тогда guys_json (вводящее в заблуждение имя) является обычным списком словарей (никакого отношения к JSON-формату, кроме того что синтаксис похож (как и задумано)).

Легко отсортировать список словарей по значению заданного поля:

list_of_dicts.sort(key=lambda d: d['full_name'])

Уже есть готовая функция, которую можно вместо lambda использовать:

from operator import itemgetter

list_of_dicts.sort(key=itemgetter('full_name'))

Обе вызова сортируют, используя лексикографический порядок, что для не-ASCII символов может быть не то что нужно. См. Поиск упорядоченной подстроки в строке Python.

jfs
  • 52,361
0

Решение следующее

Создаем пустой словарь отсортированных элементов

leadership_list_json_sorted = {}

Идем по первым буквам полей 'full_name'и пользуемся методом словаря setdefault, если такого ключа (буквы алфавита) нет, делаем ее ключом и добавляем объект в качестве значения, если ключ присутствует, просто добавляем объект

    for item in json.loads(guys_json):
        guys_json_sorted.setdefault(item['full_name'][0].lower(), []).append(item)

Для каждой буквы делаем свою сортировку

    for char in guys_json_sorted:
        guys_json_sorted[char].sort(key=lambda x: x['full_name'], reverse=False)

    guys_json_sorted = json.dumps(leadership_list_json_sorted, ensure_ascii=False)
while1pass
  • 2,265
  • 3
    1- не используйте вводящие в заблуждение имена. JSON это текстовый формат, используемый для сохранения объектов ввиде текста. {} в исходном коде Питона -- это словарь (type({}) == dict), это не текст (str тип). Вы с тем же успехом можете слова pickle, yaml, xml, csv, etc в имена добавлять -- это также неправильно как использовать json в этих именах. 2- Посмотрите как ваш код можно улучшить используя collections.defaultdict 3- Ваш код игнорирует проблемы сортировки не-ASCII текста -- хотя для вашего примера это и не важно. – jfs Mar 04 '16 at 00:47