Преобразование 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)])
Примечание : новые сортированные словари сохраняют порядок сортировки при удалении записей. Но когда добавляются новые ключи, они добавляются до конца, и сортировка не поддерживается.(официальный документ )