Получить значение ключа в произвольном словаре неизвестной глубины - PullRequest
1 голос
/ 28 марта 2012

У меня есть словарь неизвестной глубины и структуры. Он может содержать больше словарей, списков словарей и т. Д. Он создан из десериализации некоторого ввода JSON, созданного другой системой. В разных местах этого словаря есть ключ, возможно, несколько ключей с одним и тем же именем. Я хотел бы получить значения для каждого из этих ключей и в идеале обновить их.

Имеется такая структура каталогов:

{
  "tags":{
    "social-1":{
      "email":True,
      "twitter":True,
      "facebook":True,
      "linkedin":True,
      "type":"social"
    },
    "primary":{
      "type":"flexible",
      "width":"auto",
      "blocks":[
        {
          "type":"combo",
          "data":{
            "styles":{
              "margin":"10",
              "padding":"0",
              "borderColor":"#000",
              "borderWidth":"0",
              "borderStyle":"solid",
              "backgroundColor":"transparent",
              "width":"auto"
            },
            "placeholder":True,
            "headline":{
              "visible":False
            },
            "subHeadline":{
              "visible":False
            },
            "imageHolder":{
              "visible":True,
              "value":[
                {
                  "url":None,
                  "caption":None,
                  "width":220,
                  "height":140,
                  "padding":10,
                  "alt":"",
                  "href":None,
                  "filePath":None,
                  "sizing":"original",
                  "source":"disk",
                  "displayWidth":200,
                  "displayHeight":140,
                  "displayPadding":{
                    "left":10,
                    "top":0,
                    "right":10,
                    "bottom":10
                  }
                }
              ],
              "smartSizing":True,
              "captions":False,
              "captionDefault":None
            },
            "content":{
              "visible":True,
              "value":"<p>Your text here.</p>"
            },
            "imagePosition":"left",
            "textWrap":False,
            "type":"combo"
          }
        },
        {
          "type":"image",
          "data":{
            "styles":{
              "margin":"10",
              "padding":"0",
              "borderColor":"#000",
              "borderWidth":"0",
              "borderStyle":"solid",
              "backgroundColor":"transparent",
              "width":"auto"
            },
            "placeholder":False,
            "imageHolder":[
              {
                "url":None,
                "caption":None,
                "width":0,
                "height":140,
                "padding":10,
                "alt":"",
                "href":None,
                "filePath":None,
                "sizing":"original",
                "source":"disk",
                "displayWidth":213,
                "displayHeight":159,
                "displayPadding":{
                  "left":10,
                  "top":10,
                  "right":5,
                  "bottom":10
                }
              },
              {
                "url":None,
                "caption":None,
                "width":0,
                "height":140,
                "padding":10,
                "alt":"",
                "href":None,
                "filePath":None,
                "displayWidth":213,
                "displayHeight":159,
                "source":"disk",
                "sizing":"original",
                "displayPadding":{
                  "left":5,
                  "top":10,
                  "right":5,
                  "bottom":10
                }
              },
              {
                "url":None,
                "caption":None,
                "width":0,
                "height":140,
                "padding":10,
                "alt":"",
                "href":None,
                "filePath":None,
                "displayWidth":213,
                "displayHeight":159,
                "source":"disk",
                "sizing":"original",
                "displayPadding":{
                  "left":5,
                  "top":10,
                  "right":10,
                  "bottom":10
                }
              }
            ],
            "orientation":"horizontal",
            "smartSizing":True,
            "captions":False,
            "captionDefault":None,
            "type":"image"
          }
        }
      ]
    }
  }
}

Как мне проверить и обновить значения клавиш imageHolder?

Ответы [ 3 ]

5 голосов
/ 28 марта 2012

Вы можете использовать рекурсивную функцию, убирающуюся в значения списка и словаря:

def get_all(data, key):
    sub_iter = []
    if isinstance(data, dict):
        if key in data:
            yield data[key]
        sub_iter = data.itervalues()
    if isinstance(data, list):
        sub_iter = data
    for x in sub_iter:
        for y in get_all(x, key):
            yield y
4 голосов
/ 28 марта 2012

Рекурсивно обходите древовидную структуру, чтобы найти элементы, которые вас интересуют.Например:

>>> def process(blob):
...     for (k,v) in blob.items():
...         if k == 'imageHolder':
...             ...do-something...
...         if isinstance(v, dict):
...             process(v)

Эта строка if isinstance(v,dict): может быть заменена различными альтернативами, в зависимости от того, что именно вы ожидаете от ввода - например, вы могли бы печатать на утке что-то вроде if hasattr(v, 'items').

1 голос
/ 28 марта 2012

Вам нужна рекурсия:

    def search_key(mykey, mydict):
        if isinstance(mydict, dict):
            for key, value in mydict.items():
                search_key(mykey, value)
            if mykey in mydict:
                print 'found old_value=%r' % mydict[mykey]
                mydict[mykey]='foo' # update
        elif isinstance(mydict, (list, tuple)):
            for value in mydict:
                search_key(mykey, value)
    search_key('imageHolder', mydict)
    mydict={...} # your long json structure
    search_key('imageHolder', mydict)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...