Найти - Пользователи
Полная версия: Копирование и сортировка словарей
Начало » Python для новичков » Копирование и сортировка словарей
1
Retro
Добрый день.

Наткнулся на такие проблемы:
1. Если я правильно понимаю, то ниже приведенным способом я создаю по сути указатель, а не новую переменную.
>>> a ={'a' : 1, 'b' : 2}
>>> b = a
>>> b['a'] = 4
>>> b
{'a': 4, 'b': 2}
>>> a
{'a': 4, 'b': 2}
Как создать новую переменную и передать ей значение-словарь?

2. Вторая проблема иллюстрируется так:
>>> x = dict(good = 10, bad = 3, evil = 4)
>>> x
{'bad': 3, 'good': 10, 'evil': 4}
Можно ли сделать, чтобы порядок вывода ключей совпадал с изначально заданным? Собственно, просто не совсем понятно, почему он выводит их в произвольном порядке.
Nik
1.
>>> a ={'a' : 1, 'b' : 2}
>>> b = dict(a)
>>> b['a'] = 4
>>> a, b
({'a': 1, 'b': 2}, {'a': 4, 'b': 2})
>>> b = a.copy()
>>> b['a'] = 4
>>> a, b
({'a': 1, 'b': 2}, {'a': 4, 'b': 2})
>>> import copy
>>> b = copy.deepcopy(a) # Создаем полную копию
>>> b['a'] = 4
>>> a, b
({'a': 1, 'b': 2}, {'a': 4, 'b': 2})
2. Нельзя. Словари относятся к отображениям, а не к последовательностям. Элементы располагаются в произвольном порядке.
regall
1. Используйте модуль copy (вы правильно поняли, передается ссылка, а не копия)
from copy import copy, deepcopy
b = copy(a)
c = deepcopy(a)
copy - для линейных структур.
deepcopy - для копирования иерархических.

2.
Retro
просто не совсем понятно, почему он выводит их в произвольном порядке.
Потому что он так устроен.
Если у вас Python 3.x - ипользуйте OrderedDict. Если 2.x - придется держать отдельно упорядоченные ключи
Retro
Спасибо за ответы.
1.
b = dict(a)
Новый словарь с элементами старого - красиво и просто. Надеюсь, что тут нет подвоха и он тождественен a.copy().

2.
Спасибо, OrderedDict выручает, хотя и требует вводить ключи насильно, по порядку.
Kogrom
regall
Используйте модуль copy (вы правильно поняли, передается ссылка, а не копия)

copy - для линейных структур.
deepcopy - для копирования иерархических.
У словарей есть метод copy, так что модуль может не пригодиться.
Использование deepcopy - скорее всего признак дефектов в архитектуре проекта. Хотя могу заблуждаться.
regall
docs.python.org
The difference between shallow and deep copying is only relevant for compound objects (objects that contain other objects, like lists or class instances):

A shallow copy constructs a new compound object and then (to the extent possible) inserts references into it to the objects found in the original.
A deep copy constructs a new compound object and then, recursively, inserts copies into it of the objects found in the original.
Андрей Светлов
Чаще всего - именно таки дефекты в архитектуре. Но как затычка deepcopy бывает очень к месту.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB