Преобразование 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 ответов:
вы создаете словарь первый, а затем передать этот словарь в
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