2015-09-06 46 views
1

我正在嘗試使用pandoc的JSON AST格式。在Python中操作嵌套字典/列表樹3

它將其格式化爲這樣。

[ 
    { 
    "unMeta": { 
     "date": { 
     "t": "MetaInlines", "c": [ 
      {"t": "Str", "c": "2015-08-23"}]}, 
     "version": { 
     "t": "MetaString", "c": "0.22"}, 
     "author": { 
     "t": "MetaInlines", "c": [ 
      {"t": "Str", "c": "John"}, 
      {"t": "Space", "c": []}, 
      {"t": "Str", "c": "MacFarlane"}]}, 
     "title": { 
     "t": "MetaInlines", "c": [ 
      {"t": "Str", "c": "CommonMark"}, 
      {"t": "Space", "c": []}, 
      {"t": "Str", "c": "Spec"}]}, 
     "license": { 
     "t": "MetaInlines", "c": [ 
      {"t": "Link", "c": [ 
      [ 
       {"t": "Str", "c": "CC-BY-SA"}, 
       {"t": "Space", "c": []}, 
       {"t": "Str", "c": "4.0"} 
      ], 
      ["http://creativecommons.org/licenses/by-sa/4.0/", ""]] 
      } 
     ] 
     } 
    } 
    }, 
    [ 
    {"t": "Header", "c": [1, ["introduction", [], []], [ 
     {"t": "Str", "c": "Introduction"}]]}, 
    {"t": "Header", "c": [2, ["what-is-markdown", [], []], [ 
     {"t": "Str", "c": "What"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "is"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "Markdown?"}]]}, 
    {"t": "Para", "c": [ 
     {"t": "Str", "c": "Markdown"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "is"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "a"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "plain"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "text"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "format"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "for"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "writing"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "structured"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "documents,"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "based"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "on"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "conventions"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "used"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "for"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "indicating"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "formatting"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "in"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "email"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "and"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "usenet"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "posts."}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "It"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "was"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "developed"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "in"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "2004"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "by"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "John"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "Gruber,"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "who"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "wrote"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "the"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "first"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "Markdown-to-HTML"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "converter"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "in"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "perl,"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "and"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "it"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "soon"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "became"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "widely"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "used"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "in"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "websites."}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "By"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "2014"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "there"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "were"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "dozens"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "of"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "implementations"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "in"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "many"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "languages."}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "Some"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "of"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "them"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "extended"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "basic"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "Markdown"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "syntax"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "with"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "conventions"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "for"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "footnotes,"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "definition"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "lists,"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "tables,"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "and"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "other"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "constructs,"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "and"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "some"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "allowed"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "output"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "not"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "just"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "in"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "HTML"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "but"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "in"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "LaTeX"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "and"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "many"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "other"}, 
     {"t": "Space", "c": []}, 
     {"t": "Str", "c": "formats."}]}]] 

我怎麼能發生變異/格式化該這樣,當"t""c"是字典鍵,我得到一個更可讀的字典在字典鍵t的價值是我的新字典的關鍵,和值'c'是我的新詞典的價值。

成功的結果會是這個樣子:

{ 
    "unMeta": { 
     "date": { 
     "MetaInlines": [ 
      {"Str": "2015-08-23"}]}, 
     "version": { 
     "MetaString": "0.22"}, 
     "author": { 
     "MetaInlines": [ 
      {"Str": "John"}, 
      {"Space": []}, 
      {"Str": "MacFarlane"}]}, 
     "title": { 
     "MetaInlines": [ 
      {"Str": "CommonMark"}, 
      {"Space": []}, 
      {"Str": "Spec"}]}, 
     "license": { 
     "MetaInlines": [ 
      {"Link": [ 
      [ 
       {"Str": "CC-BY-SA"}, 
       {"Space": []}, 
       {"Str": "4.0"} 
      ], 
      ["http://creativecommons.org/licenses/by-sa/4.0/", ""]] 
      } 
     ] 
     } 
    } 
    }, 

我目前的策略是這樣的。在一個while循環中,我一直迭代,直到找到"t""c"作爲字典的鍵,然後我在包含鍵的字典上調用一個函數,該函數返回一個新的字典,將found設置爲True,並在原來的位置字典值,然後讓while循環運行,直到找不到更多的實例。有沒有更好的辦法?

+0

你能分享你寫的代碼嗎? –

回答

2

你的循環如何檢查主列表中的所有字典,這些字典中的所有字典,以及每個內部字典中的字典列表等......?這種類型的問題通常通過遞歸來解決。該函數遍歷原始列表中的值。當遇到{'t':x, 'c':y}字典時,它會將其更改爲{x: y}。當它遇到任何其他類型的字典或列表時,該函數會自動調用該項目。

def mutate(iterable): 
    if isinstance(iterable, list): 
     indexed_list = enumerate(iterable) 
    elif isinstance(iterable, dict): 
     indexed_list = iterable.items() 
    for k, item in indexed_list: 
     if isinstance(item, dict) and sorted(item.keys()) == ['c', 't']: 
      iterable[k] = {item['t']: item['c']} 
     if isinstance(item, dict) or isinstance(item, list): 
      mutate(item)