Найти - Пользователи
Полная версия: Изменение вложеного словаря
Начало » Python для новичков » Изменение вложеного словаря
1
xost
Добрый день.

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

#!/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 которая бы меняла необходимый элемент в словаре заданный списком ключей ?

Заранее спасибо за подсказки.
FishHook
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
xost
2FishHook Спасибо за ответ, но это не то чего я хотел добиться. В моём примере два уровня вложенности, а если их будет три или более ? Например
dicta={'a':{'aa':1,'bb':{'aaa':333,'bbb':444}}}
и я хочу поменять например элемент
dicta['a']['bb']['bbb']
Хочется иметь возможность изменения элемента заданного ИМЕННО СПИСКОМ ключей.
Т.е. не хочется решения “в лоб”.
FishHook
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
xost
Спасибо большое. Сам не допетрил.
sergeek
или вот если хотел рекурсию
def setnode(d,keys,val):
    if len(keys) > 1:
        setnode(d[keys[0]],keys[1:],val)
    else:
        d[keys[0]] = val
xost
2sergeek Спасибо. Понял свою ошибку. В принципе и мой пример получается не сложно было бы переделать в работоспособный вариант, он был бы похож на ваш. Но что то меня заклинило.
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