2012-12-20 34 views
2

我有一個Python字典,看起來像這樣獲取一個python dict.keys跟蹤每個項目

{'data': [{'data': [{'data': 'gen1', 'name': 'objectID'}, 
        {'data': 'familyX', 'name': 'family'}], 
      'name': 'An-instance-of-A'}, 
     {'data': [{'data': 'gen2', 'name': 'objectID'}, 
        {'data': 'familyY', 'name': 'family'}, 
        {'data': [{'data': [{'data': '21', 
             'name': 'objectID'}, 
             {'data': 'name-for-21', 
             'name': 'name'}, 
             {'data': 'no-name', 'name': None}], 
           'name': 'An-instance-of-X:'}, 
          {'data': [{'data': '22', 
             'name': 'objectID'}], 
           'name': 'An-instance-of-X:'}], 
        'name': 'List-of-2-X-elements:'}], 
      'name': 'An-instance-of-A'}], 
'name': 'main'} 

結構是重複其規則是這樣的:

  • 的字典中包含的名字'和'data'
  • 'data'可以包含一列字典
  • 如果'data'不是一個列表,它是我需要的值。
  • 「名」是隻是一個名字

的問題是,對於每個值,我需要知道每個父母每一個信息。

所以在最後,我需要打印的項目清單,看起來像:

objectID=gen2 family=familyY An-instance-of-X_objectID=21 An-instance-of-X_name=name-for-21 

編輯:這只是幾行我想作爲輸出之一。對於沒有字典作爲'數據'的每個項目,我需要這樣一行。

所以,這不是一個字典的每個數據,遍歷起來,找到信息,並打印出來..

我不知道像itertools和收藏模塊每一個功能。但是有什麼我可以使用的嗎?這是什麼叫(當我試圖自己研究)?

我可以找到許多「扁平化字典」的方法,而不是像現在這樣,不是我有這樣的「數據」,「名」 ..

+1

我認爲這是一個瘋狂的字典?爲什麼你有這樣一個字典,它不是一個更好的方法嗎? – Netwave

+0

這看起來很像'json'數據。那是什麼?如果是這樣,你可以直接使用json模塊 – inspectorG4dget

+0

對我來說就像是一個JSON。 –

回答

3

這是一個很好的例子是什麼遞歸適合:

input_ = {'data': [{'data': [{'data': 'gen1', 'name': 'objectID'}, 
        {'data': 'familyX', 'name': 'family'}], 
      'name': 'An-instance-of-A'}, 
     {'data': [{'data': 'gen2', 'name': 'objectID'}, 
        {'data': 'familyY', 'name': 'family'}, 
        {'data': [{'data': [{'data': '21', 
             'name': 'objectID'}, 
             {'data': 'name-for-21', 
             'name': 'name'}, 
             {'data': 'no-name', 'name': None}], 
           'name': 'An-instance-of-X:'}, 
          {'data': [{'data': '22', 
             'name': 'objectID'}], 
           'name': 'An-instance-of-X:'}], 
        'name': 'List-of-2-X-elements:'}], 
      'name': 'An-instance-of-A'}], 
'name': 'main'} 

def parse_dict(d, predecessors, output): 
    """Recurse into dict and fill list of path-value-pairs""" 
    data = d["data"] 
    name = d["name"] 
    name = name.strip(":") if type(name) is str else name 
    if type(data) is list: 
     for d_ in data: 
      parse_dict(d_, predecessors + [name], output) 
    else: 
     output.append(("_".join(map(str,predecessors+[name])), data)) 

result = [] 

parse_dict(input_, [], result) 

print "\n".join(map(lambda x: "%s=%s"%(x[0],x[1]),result)) 

輸出:

main_An-instance-of-A_objectID=gen1 
main_An-instance-of-A_family=familyX 
main_An-instance-of-A_objectID=gen2 
main_An-instance-of-A_family=familyY 
main_An-instance-of-A_List-of-2-X-elements_An-instance-of-X_objectID=21 
main_An-instance-of-A_List-of-2-X-elements_An-instance-of-X_name=name-for-21 
main_An-instance-of-A_List-of-2-X-elements_An-instance-of-X_None=no-name 
main_An-instance-of-A_List-of-2-X-elements_An-instance-of-X_objectID=22 

我希望我理解正確你的要求。如果您不想將路徑加入字符串,則可以保留前輩列表。

問候,

托爾斯滕

+0

OP的示例將名稱中的後綴標記去掉 - 您可能想要添加該行爲。除此之外,我在這裏找不到任何錯誤,儘管我仍然沒有絲毫的想法,爲什麼OP要以這種方式打印數據,尤其是考慮到它使得很難在相同的名單分開。 –

+0

我不會讀這個我的自我..我的日誌分析器會這樣做:)所以這是它的完美格式.. – xeor

+0

這個解決方案几乎是我在找的,謝謝!我會稍微磨光一下以適應確切的需求。 – xeor