2014-02-11 66 views
0

我想從嵌套的OrderedDict中找到給定鍵的值。在嵌套的有序字典中查找給定的鍵的值python

要點:

  • 我不知道有多深本字典將嵌套
  • 我要找的鍵的名稱是固定的,這將是在字典某處

我想回叫在這個例子中「powerpoint_color」鍵的值...

mydict= OrderedDict([('KYS_Q1AA_YouthSportsTrustSportParents_P', 
         OrderedDict([('KYS_Q1AA', 
            OrderedDict([('chart_layout', '3'), 
               ('client_name', 'Sport Parents (Regrouped)'), 
               ('sort_order', 'asending'), 
               ('chart_type', 'pie'), 
               ('powerpoint_color', 'blue'), 
               ('crossbreak', 'Total')]))])), 

我最初的想法是做這樣的事情:

print mydict[x][i]['powerpoint_color'] 

但我得到這個錯誤:

list indices must be integers, not str 

有什麼建議?

+0

'mydict'不是一本字典,而是元組和列表的混合體。 – Hyperboreus

+0

這不是'dict',它是元組列表的元組列表元組(或某物)的元組列表。開始簡化你的結構 – njzk2

+0

剛剛更新了它... –

回答

1

如果您不知道密鑰會在哪個深度出現,您需要遍歷整個字典。

我很自由,可以將您的數據轉換爲實際的有序字典。該功能在同一個密鑰出現在不同的子目錄的情況下可能會產生不止一個結果:

from collections import OrderedDict 

mydict = OrderedDict ({'KYS_Q1AA_YouthSportsTrustSportParents_P': 
      OrderedDict ({'KYS_Q1AA': 
       OrderedDict ([ ('chart_layout', '3'), 
       ('client_name', 'Sport Parents (Regrouped)'), 
       ('sort_order', 'asending'), 
       ('chart_type', 'pie'), 
       ('powerpoint_color', 'blue'), 
       ('crossbreak', 'Total') 
       ]) }) }) 

def listRecursive (d, key): 
    for k, v in d.items(): 
     if isinstance (v, OrderedDict): 
      for found in listRecursive (v, key): 
       yield found 
     if k == key: 
      yield v 

for found in listRecursive (mydict, 'powerpoint_color'): 
    print (found) 

如果你有興趣,你已經找到了鑰匙,就可以相應地調整代碼:

def listRecursive (d, key, path = None): 
    if not path: path = [] 
    for k, v in d.items(): 
     if isinstance (v, OrderedDict): 
      for path, found in listRecursive (v, key, path + [k]): 
       yield path, found 
     if k == key: 
      yield path + [k], v 

for path, found in listRecursive (mydict, 'powerpoint_color'): 
    print (path, found) 
+0

這是壞蛋!非常感謝! –

+0

@ Boosted_d16看我的編輯檢索每個項目的路徑。 – Hyperboreus

+0

非常有用的東西! –

1

您正在尋找

print [y[1] for y in mydict[x][i] if y[0] == 'powerpoint_color'] 

此過濾最深的元組中的第一個項目,以尋找powerpoint_color,並只保留第二個。

1

試試這個

mydict = ['KYS_Q1AA_YouthSportsTrustSportParents_P', 
     ['KYS_Q1AA', 
      [{'chart_layout': '3'}, 
      {'client_name': 'Sport Parents (Regrouped)'}, 
      {'sort_order': 'asending'}, 
      {'chart_type': 'pie'}, 
      {'powerpoint_color': 'blue'}, 
      {'crossbreak':'Total'} 
      ]]] 

然後...

print mydict[1][1][4]['powerpoint_color'] 
+0

好的,爲什麼要投下一票?我回答了這個問題,它的工作原理。我只是走了一條與衆不同的路線。 – KodyVanRy

+0

感謝您的努力夥計,我會讚揚它! –