Форум сайта python.su
0
Добрый день.
возникла такая задача:
#!/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
Отредактировано xost (Янв. 17, 2013 10:11:00)
Офлайн
568
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)
Офлайн
0
2FishHook Спасибо за ответ, но это не то чего я хотел добиться. В моём примере два уровня вложенности, а если их будет три или более ? Например
dicta={'a':{'aa':1,'bb':{'aaa':333,'bbb':444}}}
dicta['a']['bb']['bbb']
Отредактировано xost (Янв. 17, 2013 11:59:51)
Офлайн
568
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
Офлайн
0
Спасибо большое. Сам не допетрил.
Офлайн
43
или вот если хотел рекурсию
def setnode(d,keys,val): if len(keys) > 1: setnode(d[keys[0]],keys[1:],val) else: d[keys[0]] = val
Офлайн
0
2sergeek Спасибо. Понял свою ошибку. В принципе и мой пример получается не сложно было бы переделать в работоспособный вариант, он был бы похож на ваш. Но что то меня заклинило.
Офлайн