У меня есть словарь, ключи которого являются кортежи, такие как (int, str, int, str, int)
, а соответствующие значения являются списками с плавающей точкой одинакового размера.
Я дважды засолил словарь одним и тем же сценарием:
import pickle
with open(name, 'wb') as source:
pickle.dump(the_dict, source)
Для двух полученных двоичных файлов test_1
и test_2
я запускаю
diff test_1 test_2
в терминале (я использую macOS), чтобы увидеть, могу ли я использовать diff
чтобы определить разницу. Тем не менее, я получил
Binary files test_1 and test_2 differ
Зачем? Один и тот же словарь мариновался по-разному? Означает ли это, что я не могу использовать diff, чтобы определить, идентичны ли два словаря?
В зависимости от того, какую версию Python вы используете, версии Python до v3.6 не помнят порядок вставки. Python v3.6 сделал это деталью реализации, а v3.7 - языковой особенностью.
Для обратной совместимости вы не должны зависеть от словаря, запоминающего порядок вставленных ключей. Вместо этого вы можете использовать OrderedDict из модуля Коллекции.
Кроме того, использование различий в данных маринованных диктов может показать различия в данных, даже если фактические словари эквивалентны - поскольку в отличие от списков дикты обычно не дают никаких гарантий относительно состояния заказа (см. Выше, когда это не так).
OrderedDict()
, иначе они, скорее всего, будут переставлены.diff
не является хорошим способом для сравнения засоленных данных, даже для двоичных данных в целом.