Как мне отсортировать имя файла JSON с числовыми именами файлов в качестве ключа, используя Python? - PullRequest
0 голосов
/ 06 июля 2018

У меня есть файл JSON с именами файлов и описанием для каждой пары ключей и значений. Однако, используя OrderedDict, когда я пытаюсь отсортировать файл, он приводит к порядку 0.jpg 1.jpg 10.jpg 11 ..... 2 20 и т. д.

op={int(k) : v for k, v in output.items()}

Я пытался сделать это, но он возвращает ошибку ValueError. Ошибка выглядит следующим образом

ValueError: недопустимый литерал для int () с основанием 10: '1520.png'

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

Вы вызываете функцию int() для строки, которая не полностью состоит из цифр. Созданное вами словарное понимание проходит по каждой паре ключ / значение в исходном dict output и пытается привести каждый ключ к целому числу.

В вашем примере ключами являются имена файлов, такие как "0.png", "1.jpg", "10.png" и т. Д., И строка типа '10.png' не может быть превращена в целое число. Вот почему вы получаете ValueError.

Упорядочить словари в Python немного сложно, потому что мы думаем, что все должно основываться на значении ключа, тогда как на самом деле Python упорядочивает ключи словаря на основе их значения хеш-функции.

Что касается использования OrderedDict, этот контейнер запоминает только порядок, в котором были вставлены ключи. Похоже, что это даст вам некоторую возможность сортировки, но это может только гарантировать, что порядок, в котором вы перебираете ключи, совпадает с порядком, в котором вы помещаете их в словарь.

Это должно помочь вам, хотя:

od = OrderedDict()
for key in sorted(output):
    od[key] = output[key]

Это поместит все ключи исходного диктата output в список, отсортирует его, а затем прикрепит каждый в отсортированном порядке в OrderedDict с правильным значением.

0 голосов
/ 06 июля 2018
OrderedDict(sorted(output.items(), key=lambda item: int(item[0].split('.')[0])))

Пример

output = {f'{i}.jpg': None for i in reversed(range(21))}

od = OrderedDict(sorted(output.items(), key=lambda item: int(item[0].split('.')[0])))

Выход:

OrderedDict([('0.jpg', None),
             ('1.jpg', None),
             ('2.jpg', None),
             ('3.jpg', None),
             ('4.jpg', None),
             ('5.jpg', None),
             ('6.jpg', None),
             ('7.jpg', None),
             ('8.jpg', None),
             ('9.jpg', None),
             ('10.jpg', None),
             ('11.jpg', None),
             ('12.jpg', None),
             ('13.jpg', None),
             ('14.jpg', None),
             ('15.jpg', None),
             ('16.jpg', None),
             ('17.jpg', None),
             ('18.jpg', None),
             ('19.jpg', None),
             ('20.jpg', None)])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...