Станом на Python 3.6 вбудований дикт буде замовлений
Хороша новина, тому оригінальний випадок використання ОП картування пар, отриманих із бази даних, з унікальними ідентифікаторами рядків як ключами та числовими значеннями як значеннями у вбудований Python v3.6 + dict, тепер повинен поважати порядок вставки.
Якщо сказати отримані два вирази таблиці стовпців із запиту бази даних, наприклад:
SELECT a_key, a_value FROM a_table ORDER BY a_value;
буде зберігатися у двох кортежах Python, k_seq і v_seq (вирівнюються за числовим індексом і з однаковою довжиною курсу), тоді:
k_seq = ('foo', 'bar', 'baz')
v_seq = (0, 1, 42)
ordered_map = dict(zip(k_seq, v_seq))
Дозволити виводити пізніше як:
for k, v in ordered_map.items():
print(k, v)
У цьому випадку поступається (для нового вбудованого протоколу Python 3.6+!):
foo 0
bar 1
baz 42
в такому ж порядку впорядкованості за значенням v.
Там, де в моїй машині встановлено Python 3.5, він наразі дає:
bar 1
foo 0
baz 42
Деталі:
Як запропонував у 2012 році Реймонд Хеттінгер (пор. Пошта на python-dev з темою "Більш компактні словники з більш швидкою ітерацією" ), а тепер (у 2016 році) оголошений у пошті Віктора Стіннера до python-dev з темою " Дік Python 3.6 стає компактний і отримує приватну версію, а ключові слова впорядковуються " завдяки виправленню / реалізації випуску 27350 " Компактний і впорядкований dict " в Python 3.6 ми тепер зможемо використовувати вбудований dict для підтримки порядку вставки !!
Сподіваємось, це призведе до виконання тонкого шару впорядкованого порядку як першого кроку. Як зазначає @ JimFasarakis-Hilliard, деякі бачать випадки використання для типу OrdersDict також у майбутньому. Я думаю, що спільнота Python взагалі ретельно перевірить, чи це витримає перевірку часу та які будуть наступні кроки.
Час переосмислити свої звички кодування, щоб не упустити можливості, відкриті стабільним замовленням:
- Аргументи ключових слів і
- (проміжне) зберігання dict
Перший тому, що в деяких випадках полегшує відправлення при здійсненні функцій та методів.
Другий, оскільки заохочує легше використовувати dict
s як проміжне зберігання в обробці трубопроводів.
Реймонд Хеттінгер люб’язно надав документацію, що пояснює " Техніку за словниками Python 3.6 " - з презентації групи "Сан-Франциско Python Meetup Group 2016-DEC-08".
І, можливо, цілком багато оформлених сторінок запитань та відповідей на Stack Overflow отримають варіанти цієї інформації, і багато високоякісних відповідей також потребуватимуть оновлення версії.
Caveat Emptor (але також див. Нижче оновлення 2017-12-15):
Як справедливо зазначає @ajcr: "Аспект, що зберігає замовлення, у цій новій реалізації вважається детальною частиною реалізації, і на неї не слід покладатися". (з Whatsnew36 ) не збирав ніт, але цитування було скорочено песимістично ;-). Це продовжується як "(це може змінитися в майбутньому, але бажано, щоб ця нова диктовка була реалізована мовою протягом декількох випусків, перш ніж змінити специфікацію мови на мандат, що зберігає порядок, для всіх поточних та майбутніх реалізацій Python; це також допомагає зберегти сумісність назад із старими версіями мови, де досі діє випадковий порядок ітерації, наприклад, Python 3.5). "
Так, як і в деяких людських мовах (наприклад, німецькій), вживання формує мову, і воля тепер була оголошена ... у Whatsnew36 .
Оновлення 2017-12-15:
У пошті до списку пітон-розробок Гвідо ван Россум заявив:
Зробіть так. "Дикт зберігає порядок вставки" є постановою. Дякую!
Отже, побічний ефект впорядкування вставки дикту версії 3.6 CPython тепер стає частиною мовної специфікації (і вже не лише деталі реалізації). Цей поштовий потік також виявив деякі відмітні цілі дизайну, про які collections.OrderedDict
нагадав Реймонд Хеттінгер під час обговорення.