У меня возникли проблемы с использованием 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')])
На этот раз это в порядке, но это не должно печатать другие вещи, хотя? (Помещение в список и отображение вызова функции.)
Где я делаю свою ошибку? Это не должно быть связано с пи-версией Python, потому что это всего лишь версия для Linux.
источник
OrderedDict
сортируется по порядку вставки, а не по алфавитно-цифровому порядку клавиш.Ответы:
Сначала вы создаете словарь , а затем передаете этот словарь в
OrderedDict
. Для версий Python <3.6 (*) к тому времени, когда вы это сделаете, порядок больше не будет правильным.dict
по своей сути не заказан.Вместо этого передайте последовательность кортежей:
Когда вы печатаете, вы видите
OrderedDict
его представление , и оно совершенно правильно.OrderedDict([('PRICE', 250), ('HP', 50), ('NAME', 'Albatross'), ('BLASTERS', 13), ('THRUSTERS', 18)])
просто показывает вам, в воспроизводимом представлении, каково содержимоеOrderedDict
.(*) : В реализации CPython 3.6
dict
тип был обновлен, чтобы использовать внутреннюю структуру с более эффективным использованием памяти, которая имеет побочный эффект сохранения порядка вставки, и, следовательно, код, показанный в вопросе, работает без проблем. Начиная с Python 3.7, спецификация языка Python была обновлена, чтобы требовать, чтобы все реализации Python следовали этому поведению. Посмотрите этот другой мой ответ для деталей, а также почему вы все еще можете использоватьOrderedDict()
для определенных случаев.источник
print ship
?? Спасибо :)OrderedDict
будет создан он является словарем.Если вы не можете отредактировать эту часть кода, где был определен ваш dict, вы все равно можете упорядочить его в любом месте любым удобным для вас способом, например так:
источник
Большую часть времени мы обращаемся к OrderedDict, когда нам требовался нестандартный заказ, а не общий, такой как ASC и т. Д.
Вот предлагаемое решение:
Это будет вывод:
Примечание . Новые отсортированные словари сохраняют порядок сортировки при удалении записей. Но когда добавляются новые ключи, ключи добавляются в конец, и сортировка не поддерживается. ( Официальный документ )
источник
Используйте dict.items (); это может быть так просто, как показано ниже:
источник