2016-08-17 2 views
1

У меня есть вложенное Dict, как это, но гораздо больше:Альтернатива использованию deepcopy для вложенных словарей?

d = {'a': {'b': 'c'}, 'd': {'e': {'f':2}}} 

Я написал функцию, которая принимает словарь и путь ключей в качестве входных данных и возвращает значение, связанное с этим путем.

>>> p = 'd/e' 
>>> get_from_path(d, p) 
>>> {'f':2} 

Как только я получу вложенный словарь, мне нужно будет его изменить, однако d не может быть изменен. Нужно ли использовать deepcopy, или есть более эффективное решение, которое не требует постоянного копирования копий словаря?

+0

Является ли ваше возражение против метода глубокой печати только по эффективности? Является ли это критически важной частью вашего кода, где это вызовет проблему? – SethMMorton

+0

После того, как вы найдете вложенный словарь, вам нужно его только скопировать. Поэтому я не уверен, что подразумевается под «требованием постоянного создания копий словаря»? – Karin

+0

@SethMMorton Совсем нет. Очевидно, что более эффективное решение всегда лучше, но мое главное возражение состоит в том, что я не хочу импортировать модуль копирования. – Bretsky

ответ

1

В зависимости от вашего случая использования, один подход, чтобы избежать внесения изменений в существующий словарь, чтобы обернуть его в collections.ChainMap:

>>> import collections 

>>> # here's a dictionary we want to avoid dirty'ing 
>>> d = {i: i for in in range(10)} 

>>> # wrap into a chain map and make changes there 
>>> c = collections.ChainMap({}, d) 

Теперь мы можем добавить новые ключи и значения c без соответствующих изменений, происходящих в d

>>> c[0] = -100 
>>> print(c[0], d[0]) 
-100 0 

ли это решение подходит зависит от случая использования ... в частности ChainMap будет:

  • не ведут себя как обычная карта, когда дело доходит до некоторых вещей, как удаление ключей:

    >>> del c[0] 
    >>> print(c[0]) 
    0 
    
  • все еще позволяют изменять значения в месте

    >>> d = dict(a=[]) 
    >>> collections.ChainMap({}, d)["a"].append(1) 
    

    изменит список в d

Однако, если вы просто желаете возьмите свой встроенный словарь и поместите в него новые ключи и значения, тогда может быть уместно ChainMap.

+0

Каким образом эта шкала для вложенных словарей (о чем спрашивал ОП)? – martineau

+0

Это похоже на создание мелкого словаря.Если 'd' имеет изменяемый атрибут, такой как список, изменение списка в' c' также изменит его в 'd'. – Karin

+0

Как это отличается от c = copy.deepcoy (d)? –

Смежные вопросы