Який правильний спосіб ініціалізувати впорядкований словник (OD), щоб він зберігав порядок початкових даних?
from collections import OrderedDict
# Obviously wrong because regular dict loses order
d = OrderedDict({'b':2, 'a':1})
# An OD is represented by a list of tuples, so would this work?
d = OrderedDict([('b',2), ('a', 1)])
# What about using a list comprehension, will 'd' preserve the order of 'l'
l = ['b', 'a', 'c', 'aa']
d = OrderedDict([(i,i) for i in l])
Питання:
Чи буде
OrderedDict
збережений порядок списку кортежів, або кортеж кортежів, кортеж списків або список списків тощо, переданих під час ініціалізації (2-й та 3-й приклад вище)?Як можна перевірити, чи
OrderedDict
дійсно підтримує замовлення? Оскільки adict
має непередбачуваний порядок, що робити, якщо на щастя мої тестові вектори мають такий же початковий порядок, що і непередбачуваний порядок диктату? Наприклад, якщо замість того,d = OrderedDict({'b':2, 'a':1})
щоб писатиd = OrderedDict({'a':1, 'b':2})
, я можу помилково зробити висновок про збереження порядку. У цьому випадку я з’ясував, що adict
впорядковується в алфавітному порядку, але це може бути не завжди правдою. Що є надійним способом використання контрприкладу, щоб перевірити, чи зберігає структура даних порядок чи ні, окрім спроб тестування векторів повторно, поки один не зламається?
PS Я просто залиште це для посилання : "Конструктор OrdersDict та update () метод приймають аргументи ключових слів, але їх порядок втрачається, оскільки семантика виклику функції Python передає аргументи ключових слів, використовуючи звичайний не упорядкований словник".
PPS: Сподіваємось, в майбутньому OrdersDict збереже також порядок kwargs (приклад 1): http://bugs.python.org/issue16991