2015-11-03 3 views
0

У меня есть вложенная структура списков и словарей python.Доступ к элементам в произвольно вложенной структуре списков/dicts

tree = { 'blah': [ "booz", {'foobar': [ { 'somekey': 'someval' } ] } ] } 

У меня также есть несколько рекурсивных функций, которые позволяют мне пройти tree иерархии сверху вниз и возврата ключей и значений, которые мне нужны. например .:

def get_objectcontent(obj, objid): 

    result = None 

    if isinstance(obj, dict): 
     for key, val in obj.items(): 
      if key == objid: 
       result = val 
      elif isinstance(val, list) or isinstance(val, dict): 
       retval = get_objectcontent(val, objid) 
       if retval is not None: 
        result = retval 
    elif isinstance(obj, list): 
     for elem in obj: 
      if isinstance(elem, list) or isinstance(elem, dict): 
       retval = get_objectcontent(elem, objid) 
       if retval is not None: 
        result = retval 

    return result 

К сожалению, я хочу изменить данные в tree тоже, и это проблема. Это возможно только решение, которое я могу видеть это построить «путь» к элементу динамически во время ходьбы вниз по tree и построить что-то вроде:

tree['blah'][1]['foobar'][0]['somekey']) = 'newval'

я не нашел какой-либо способ, как я мог бы указать на мой ключ в Python (когда я знаю, где это в структуре).

Есть ли какой-нибудь другой, более разумный способ решить эту проблему в Python 3?

ответ

0

Вы в конечном счете ищет objid как ключ в dict, так что вы можете изменить:

result = val 

к:

result = obj 

Затем абонент может сделать:

result[objid] = new_val 

Вы также можете рассмотреть возможность замены присвоений на result с операциями return, предполагая, что вы не против получения первого экземпляра, а не последнего.

+0

спасибо, удивительно простой. – tvm

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