Преобразование dict в OrderedDict


У меня возникли некоторые проблемы с использованием класса collections.OrderedDict. Я использую Python 2.7 на Raspbian, дистрибутиве Debian для Raspberry Pi. Я пытаюсь напечатать два словаря для сравнения (бок о бок) для текстового приключения. Порядок очень важен для точного сравнения. Что бы я ни пробовал, словари печатают в своей обычной неупорядоченной манере.

Вот что я получаю, когда делаю это на своем RPi:

import collections

ship = {"NAME": "Albatross",
         "HP":50,
         "BLASTERS":13,
         "THRUSTERS":18,
         "PRICE":250}

ship = collections.OrderedDict(ship)

print ship
# OrderedDict([('PRICE', 250), ('HP', 50), ('NAME', 'Albatross'), ('BLASTERS', 13), ('THRUSTERS', 18)])

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

Вот что я получил, запустив нечто подобное на своем ПК:

import collections

Joe = {"Age": 28, "Race": "Latino", "Job": "Nurse"}
Bob = {"Age": 25, "Race": "White", "Job": "Mechanic", "Random": "stuff"}

#Just for clarity:
Joe = collections.OrderedDict(Joe)
Bob = collections.OrderedDict(Bob)

print Joe
# OrderedDict([('Age', 28), ('Race', 'Latino'), ('Job', 'Nurse')])
print Bob
# OrderedDict([('Age', 25), ('Race', 'White'), ('Job', 'Mechanic'), ('Random', 'stuff')])

На этот раз он в порядке, но он не должен печатать другие вещи, хотя правильно? (Помещая его в список и показывая вызов функции.)

Где я делаю свою ошибку? Это не должно иметь ничего общего с pi-версией Python, потому что это просто версия Linux.

3 91

3 ответа:

Вы создаете словарь сначала, а затем передаете этот словарь в OrderedDict. К тому времени, когда вы это сделаете, порядок больше не будет правильным. dict по своей сути не упорядочен.

Вместо этого передайте в последовательности кортежей:

ship = [("NAME", "Albatross"),
        ("HP", 50),
        ("BLASTERS", 13),
        ("THRUSTERS", 18),
        ("PRICE", 250)]
ship = collections.OrderedDict(ship)

То, что вы видите, когда печатаете OrderedDict, это представление, и это совершенно правильно. OrderedDict([('PRICE', 250), ('HP', 50), ('NAME', 'Albatross'), ('BLASTERS', 13), ('THRUSTERS', 18)]) просто показывает вам, в воспроизводимом представлении, что такое содержание OrderedDict.

Если вы не можете отредактировать эту часть кода, в которой был определен ваш дикт, вы все равно можете упорядочить его в любой точке любым способом, как вы хотите, например:

from collections import OrderedDict

order_of_keys = ["key1", "key2", "key3", "key4", "key5"]
list_of_tuples = [(key, your_dict[key]) for key in order_of_keys]
your_dict = OrderedDict(list_of_tuples)

Большую часть времени мы идем на OrderedDict, когда нам требуется заказной заказ, а не общий, как ASC и т. д.

Вот предлагаемое решение:

import collections
ship = {"NAME": "Albatross",
         "HP":50,
         "BLASTERS":13,
         "THRUSTERS":18,
         "PRICE":250}

ship = collections.OrderedDict(ship)

print ship


new_dict = collections.OrderedDict()
new_dict["NAME"]=ship["NAME"]
new_dict["HP"]=ship["HP"]
new_dict["BLASTERS"]=ship["BLASTERS"]
new_dict["THRUSTERS"]=ship["THRUSTERS"]
new_dict["PRICE"]=ship["PRICE"]


print new_dict

Это будет вывод:

OrderedDict([('PRICE', 250), ('HP', 50), ('NAME', 'Albatross'), ('BLASTERS', 13), ('THRUSTERS', 18)])
OrderedDict([('NAME', 'Albatross'), ('HP', 50), ('BLASTERS', 13), ('THRUSTERS', 18), ('PRICE', 250)])

Примечание : новые сортированные словари сохраняют порядок сортировки при удалении записей. Но когда добавляются новые ключи, они добавляются до конца, и сортировка не поддерживается.(официальный документ )