Преобразование 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.

548   3  

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)])

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

Comments

    Ничего не найдено.