2014-05-12 119 views
2

我有字典的字典。我希望有一個功能,如果arguement就像是匹配的將返回所有的細節,Python中的字典的字典的迭代字典

identifiers = { 
    '42566431313931326462642d3533656132352033': {   
     'name': 'topleft',   
     'subid': { 
      'a3e54b84450000': { 
       'name': 'north'     
      } 
     }   
    }, 
    '0942378098093': {   
     'name': 'topright',   
     'subid': { 
      '4b840000100000000000': { 
       'name': 'north'     
      } 
     }   
    }, 
    '4256643131ra98892389': {   
     'name': 'bottomleft',   
     'subid': { 
      'a3e54b840000100000000000': { 
       'name': 'west'     
      } 
     }   
    } 
} 

def getdetails(p): 
    # p could be key of dict or dict of dict 
    for key in identifiers: 
     if key == p: 
      return identifiers[key]   
     else: 
      if p in identifiers[key]['subid']: 
       return identifiers[key]['subid'][p] 

我想知道是否有高貴的方式來做到這一點(可以是使用地圖和lambda)?

+0

什麼是'D',爲什麼你覆蓋'key'? – thefourtheye

+0

'identifier'與'identifiers'不同嗎? – thefourtheye

+0

提示:在Python中使用'//'註釋會引發語法錯誤 –

回答

5

可讀性很重要。當你的代碼是可讀的,我會稍微提高了代碼,這樣

def getdetails(p): 
    if p in ids: 
     return ids[p] 

    for k, v in ids.iteritems(): 
     if p in v['subid']: 
      return v['subid'][p] 

但是,如果你正在尋找一個俏皮話,您可以創建一個生成器表達式,返回的第一個值從了。

def getdetails(p): 
    if p in ids: return ids[p] 
    return next(v['subid'][p] for k, v in ids.iteritems() if p in v['subid']) 

可以進一步縮短代碼,這樣

def getdetails(p): 
    return ids.get(p) or next(v['subid'][p] for k, v in ids.iteritems() if p in v['subid']) 

dict.get將返回None如果該鍵沒有在字典中找到,並且被認爲是Falsy在Python。所以,如果它不在主詞典中,我們將檢查子詞典。

如果您正在使用Python 3.x中,你需要使用的,而不是iteritemsitems方法,這樣

def getdetails(p): 
    return ids.get(p) or next(v['subid'][p] for k, v in ids.items() if p in v['subid']) 
+0

@Pilot'a3e54b840000100000000000'應該輸出什麼? – thefourtheye

+0

@Pilot但有兩個項目匹配相同的ID。 「北」和「西」。你確定你只想要'西'嗎? – thefourtheye

+0

@Pilot請檢查最新的答案。 – thefourtheye

2
for key,value in identifiers.items(): 
     if key == p: 
      return identifiers[key]   
     else: 
      if p in identifiers[key]['subid']: 
       return identifiers[key]['subid'][p] 
2

如果您確定p在裏面subid如果不是在頂層可以是這樣的下面也會起作用。

def getdetails(p): 
    req_val = identifiers.get(p) 
    if not req_val: 
     for key, value in identifiers.items(): 
      req_val = value['subid'].get(p) 
    return req_val 
2

嘗試遞歸這樣的:

def getdetails(p, dictionary): 
    result = [] 
    if type(dictionary) is not dict: 
     return result 
    for key in dictionary: 
     if key == p: 
      result.append(dictionary[p]) 
     result += getdetails(p, dictionary[key]) 

    return result 

print getdetails('name', identifiers) 
print getdetails('subid', identifiers)