Неупорядоченный диктант в Python 3.7

Словари в python заказываются начиная с Python 3.6

От - https://stackoverflow.com/a/39980744/4647107

Заказаны ли словари в Python 3.6+?

Они заказаны на вставку. Начиная с Python 3.6, для реализации Python в CPython словари запоминают порядок вставленных элементов. Это считается деталью реализации в Python 3.6; вам нужно использовать OrderedDict, если вы хотите, чтобы порядок вставки гарантировался в других реализациях Python.

Начиная с Python 3.7, это больше не деталь реализации, а вместо этого становится особенностью языка. Из сообщения python-dev от GvR:

Сделай это так. «Dict сохраняет порядок размещения» - таково постановление. Спасибо!

Это просто означает, что вы можете на него положиться. Другие реализации Python также должны предлагать словарь с упорядоченной вставкой, если они хотят быть соответствующей реализацией Python 3.7.

Есть ли сейчас способ реализовать неупорядоченный словарь в Python?


person Pratyush Das    schedule 24.02.2019    source источник
comment
Есть ли способ реализовать неупорядоченный словарь Конечно - напишите свой собственный.   -  person John Gordon    schedule 24.02.2019
comment
какая-то конкретная причина? вы можете имитировать неупорядоченное поведение, используя random.shuffle на клавишах и обращаясь к ним, если вы действительно захотите.   -  person Paritosh Singh    schedule 24.02.2019
comment
Как бы вы заметили разницу? Старая реализация dict была полностью способна возвращать элементы в порядке вставки просто случайно.   -  person jasonharper    schedule 24.02.2019
comment
@ParitoshSingh, который может стать громоздким при хранении большого количества ключей в dict.   -  person Pratyush Das    schedule 24.02.2019
comment
@jasonharper Я не хочу, чтобы диктовка запоминала порядок вставки. Меня не волнует, является ли один из многих возможных заказов, возвращаемых dict, порядком, в котором были вставлены ключи.   -  person Pratyush Das    schedule 24.02.2019
comment
Зачем тебе это нужно?   -  person Paritosh Singh    schedule 24.02.2019
comment
Я не вижу в этом смысла. Общий вариант использования словарей - поиск O (1). Порядок влияет только на итерацию, и, как правило, это удобно, чтобы она была последовательной. Что вы на самом деле пытаетесь сделать?   -  person TigerhawkT3    schedule 24.02.2019
comment
Я предполагаю, что OP сосредоточен на нефункциональных спецификациях: влияет ли порядок, когда он не используется, тем не менее на производительность, энергопотребление, объем памяти, безопасность приложений?   -  person Bernhard Bodenstorfer    schedule 03.03.2021


Ответы (2)


Вы можете подделать это:

>>> import random
>>> d={'a':[1,2,3],'b':[4,5,6],'c':[7,8,9]}
>>> items=list(d.items())
>>> random.shuffle(items)
>>> dict(items)
{'c': [7, 8, 9], 'b': [4, 5, 6], 'a': [1, 2, 3]}
>>> 
person U11-Forward    schedule 24.02.2019
comment
Есть ли вероятность, что случайная перетасовка пар ключ-значение может стать громоздкой, если количество ключей в dict достаточно велико? - person Pratyush Das; 24.02.2019
comment
@PratyushDas Я так не думаю - person U11-Forward; 24.02.2019
comment
Я подозреваю, что цель вопроса заключалась не столько в желании непредсказуемого (случайного) порядка, сколько в желании предсказуемого и последовательного порядка (т.е. исходного поведения сортировки по ключам) независимо от порядка вставки. - person JGC; 11.12.2020

Как отмечали некоторые люди, это поможет понять, почему вам нужен неупорядоченный диктант. Лично я искал неупорядоченный диктант, потому что работал с OrderedDicts, и их поведение означало, что я не мог напрямую сравнивать их, используя ==. Например:

In [1]: from collections import OrderedDict
In [2]: dict_1 = OrderedDict([('a', 0), ('b', 1), ('c', 2)])
In [3]: dict_2 = OrderedDict([('c', 2), ('b', 1), ('a', 0)])
In [4]: dict_1 == dict_2
Out[4]: False

Простое решение - снова превратить OrderedDict в dict.

In [5]: dict(dict_1) == dict(dict_2)
Out[5]: True
person JGC    schedule 11.12.2020
comment
Обратите внимание, что вызов sorted в dict создает отсортированный список ключей словаря, а не отсортированную копию словаря. Сам словарь остается неупорядоченным. Кроме того, как литералы dict, так и конструктор dict упорядочивают начальные элементы слева направо, в то время как понимания dict вставляются в порядке их итераций. Два словаря, созданные в ответе с использованием интерпретаций dict, не равны, потому что у них разные пары ключ-значение, потому что они были созданы путем перечисления разных списков: dict_1 == {'a': 0, 'b': 1, 'c': 2} и dict_2 == {'c': 0, 'b': 1, 'a': 2}. - person jirassimok; 03.06.2021
comment
jirassimok, спасибо, вы абсолютно правы. Я перечитал свой пост и понял, что сделал несколько ошибок, которые привели к неверным предположениям. Я полностью переписал свой ответ в свете этого. - person JGC; 03.06.2021