Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 18, 2010 18:00:16

Retro
От:
Зарегистрирован: 2010-02-18
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Копирование и сортировка словарей

Добрый день.

Наткнулся на такие проблемы:
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}
Можно ли сделать, чтобы порядок вывода ключей совпадал с изначально заданным? Собственно, просто не совсем понятно, почему он выводит их в произвольном порядке.



Офлайн

#2 Фев. 18, 2010 18:18:55

Nik
От:
Зарегистрирован: 2010-01-10
Сообщения: 77
Репутация: +  0  -
Профиль   Отправить e-mail  

Копирование и сортировка словарей

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. Нельзя. Словари относятся к отображениям, а не к последовательностям. Элементы располагаются в произвольном порядке.



Офлайн

#3 Фев. 18, 2010 18:20:47

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

Копирование и сортировка словарей

1. Используйте модуль copy (вы правильно поняли, передается ссылка, а не копия)

from copy import copy, deepcopy
b = copy(a)
c = deepcopy(a)
copy - для линейных структур.
deepcopy - для копирования иерархических.

2.
Retro
просто не совсем понятно, почему он выводит их в произвольном порядке.
Потому что он так устроен.
Если у вас Python 3.x - ипользуйте OrderedDict. Если 2.x - придется держать отдельно упорядоченные ключи



Офлайн

#4 Фев. 18, 2010 19:41:54

Retro
От:
Зарегистрирован: 2010-02-18
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Копирование и сортировка словарей

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

2.
Спасибо, OrderedDict выручает, хотя и требует вводить ключи насильно, по порядку.



Офлайн

#5 Фев. 18, 2010 22:06:28

Kogrom
От:
Зарегистрирован: 2009-12-03
Сообщения: 160
Репутация: +  0  -
Профиль   Отправить e-mail  

Копирование и сортировка словарей

regall
Используйте модуль copy (вы правильно поняли, передается ссылка, а не копия)

copy - для линейных структур.
deepcopy - для копирования иерархических.
У словарей есть метод copy, так что модуль может не пригодиться.
Использование deepcopy - скорее всего признак дефектов в архитектуре проекта. Хотя могу заблуждаться.



Офлайн

#6 Фев. 18, 2010 22:17:59

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

Копирование и сортировка словарей

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.



Офлайн

#7 Фев. 19, 2010 06:17:26

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Копирование и сортировка словарей

Чаще всего - именно таки дефекты в архитектуре. Но как затычка deepcopy бывает очень к месту.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version