Обходной словарь сортировки

Проведя быстрое исследование, я обнаружил, что нет способа по-настоящему отсортировать словарь. Однако есть обходные пути, и я использовал предложенный здесь пользователя Malik.

Я провел этот тест и получил:

>>> test={"im2":1,"im4":2,"im3":-1,"im1":5}
>>> {x:test[x] for x in sorted(test)}
{'im1': 5, 'im2': 1, 'im3': -1, 'im4': 2}

это именно то поведение, которое я ищу. Любая помощь или предложение приветствуется.

Однако, когда я пытаюсь включить его в свой код, ничего не меняется. Вот код:

def loop_solution(filenames):
    mydic={'im'+str(index): import_file_astro(filename) for index, filename in enumerate(filenames, start=1) if filename is not None}
    print mydic
    mydic_upd={'im'+str(i):mydic.values()[0] for i in range(1,5) if 'im'+str(i) not in mydic}
    mydic=dict(mydic, **mydic_upd)
    print mydic
    mydic={y:mydic[y] for y in sorted(mydic)}
    print mydic
    return
loop_solution([None,'CO21_m100_100_final',None,'CO43_m100_100_final'])

и вывод:

{'im2': <astropy.io.fits.hdu.image.PrimaryHDU object at 0x11b6dc690>, 'im4': <astropy.io.fits.hdu.image.PrimaryHDU object at 0x11b7461d0>}
{'im1': <astropy.io.fits.hdu.image.PrimaryHDU object at 0x11b6dc690>, 'im3': <astropy.io.fits.hdu.image.PrimaryHDU object at 0x11b6dc690>, 'im2': <astropy.io.fits.hdu.image.PrimaryHDU object at 0x11b6dc690>, 'im4': <astropy.io.fits.hdu.image.PrimaryHDU object at 0x11b7461d0>}
{'im1': <astropy.io.fits.hdu.image.PrimaryHDU object at 0x11b6dc690>, 'im3': <astropy.io.fits.hdu.image.PrimaryHDU object at 0x11b6dc690>, 'im2': <astropy.io.fits.hdu.image.PrimaryHDU object at 0x11b6dc690>, 'im4': <astropy.io.fits.hdu.image.PrimaryHDU object at 0x11b7461d0>}

Я в недоумении, в чем может быть проблема.


person George    schedule 11.09.2018    source источник
comment
Вопрос, который вы связали, касается Swift, а не Python.   -  person Aran-Fey    schedule 11.09.2018
comment
Пробовали ли вы добавить return mydic в конце вашей функции, а затем mydic = loop_solution([...........]) вне вашего определения?   -  person vash_the_stampede    schedule 11.09.2018
comment
@ Aran-Fey Да, но обходной путь, похоже, следует той же логике.   -  person George    schedule 11.09.2018
comment
Однако @George не работает в python‹3.6. Как описано в связанном дубликате, порядок вставки не сохраняется. Только в 3.7 это стало языковой функцией.   -  person FlyingTeller    schedule 11.09.2018
comment
@FlyingTeller Не должна ли проблема возникнуть в первом фрагменте кода, который я опубликовал?   -  person George    schedule 11.09.2018
comment
@vash_the_stampede Кажется, это работает, но мне нужно, чтобы это происходило внутри функции.   -  person George    schedule 11.09.2018
comment
@ Джордж, я не понимаю, почему. В документах говорится, что порядок ключей произвольный, а не всегда зашифрованный. Может быть, в некоторых случаях порядок вставки сохраняется (вероятно, зависит от ключей, значений и длины), но вы не можете зависеть от него, да и не должны.   -  person FlyingTeller    schedule 11.09.2018
comment
Я тоже не понимаю, зачем вам это нужно. Каждый раз, когда вы перебираете свой dict, вы можете просто сделать for key in sorted(my_dict.keys()) и сохранить   -  person FlyingTeller    schedule 11.09.2018
comment
Хорошо, тогда def loop_solution(filenames, mydic) передать в функцию пустой mydic?   -  person vash_the_stampede    schedule 11.09.2018
comment
@vash_the_stampede Нет, похоже, это не помогает.   -  person George    schedule 11.09.2018
comment
как насчет использования return mydic   -  person vash_the_stampede    schedule 11.09.2018