Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 17, 2013 10:08:37

xost
От:
Зарегистрирован: 2009-08-26
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Изменение вложеного словаря

Добрый день.

возникла такая задача:

#!/usr/bin/python
dicta={'a':{'aa':1,'bb':2}}
def findnode(data,keys):
  try:
    key=keys.pop(0)
  except IndexError:
    return data
  else:
    return findnode(data[key],keys)
def setnode(data,keys,val):
  try:
    key=keys.pop(0)
  except IndexError:
    print id(data)
    data=val
    print id(data)
  else:
    setnode(data[key],keys,val)
setnode(dicta,['a','bb'],221)
print findnode(dicta,['a','bb'])
Результат:
10088244
10089584
2

Т.е. мне понятно почему в не меняется dicta. Но как тогда корректно написать функцию setnode которая бы меняла необходимый элемент в словаре заданный списком ключей ?

Заранее спасибо за подсказки.



Отредактировано xost (Янв. 17, 2013 10:11:00)

Офлайн

#2 Янв. 17, 2013 11:43:56

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Изменение вложеного словаря

dicta={'a':{'aa':1,'bb':2}}
def setnode(dct, parent, child, value):
    try:
        dct[parent][child]=value
    except KeyError:pass
setnode(dicta,'a','bb',221)
print dicta



Отредактировано FishHook (Янв. 17, 2013 11:44:43)

Офлайн

#3 Янв. 17, 2013 11:53:09

xost
От:
Зарегистрирован: 2009-08-26
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Изменение вложеного словаря

2FishHook Спасибо за ответ, но это не то чего я хотел добиться. В моём примере два уровня вложенности, а если их будет три или более ? Например

dicta={'a':{'aa':1,'bb':{'aaa':333,'bbb':444}}}
и я хочу поменять например элемент
dicta['a']['bb']['bbb']
Хочется иметь возможность изменения элемента заданного ИМЕННО СПИСКОМ ключей.
Т.е. не хочется решения “в лоб”.



Отредактировано xost (Янв. 17, 2013 11:59:51)

Офлайн

#4 Янв. 17, 2013 12:20:33

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Изменение вложеного словаря

dicta={'a':{'aa':1,'bb':{'aaa':333,'bbb':444}}}
def setnode(dct, tree, value):
    parent=dct
    try:
        for node in tree[:-1]:
            parent=parent[node]
        parent[tree[-1]]=value
    except KeyError:pass
setnode(dicta, ['a','bb','bbb'], 221)
print dicta
setnode(dicta, ['a','aa'], 'ff')
print dicta
setnode(dicta, ['a'], None)
print dicta



Офлайн

#5 Янв. 17, 2013 12:24:15

xost
От:
Зарегистрирован: 2009-08-26
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Изменение вложеного словаря

Спасибо большое. Сам не допетрил.



Офлайн

#6 Янв. 17, 2013 12:40:18

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

Изменение вложеного словаря

или вот если хотел рекурсию

def setnode(d,keys,val):
    if len(keys) > 1:
        setnode(d[keys[0]],keys[1:],val)
    else:
        d[keys[0]] = val

Офлайн

#7 Янв. 17, 2013 12:57:43

xost
От:
Зарегистрирован: 2009-08-26
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Изменение вложеного словаря

2sergeek Спасибо. Понял свою ошибку. В принципе и мой пример получается не сложно было бы переделать в работоспособный вариант, он был бы похож на ваш. Но что то меня заклинило.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version