2014-02-11 42 views
0

我有一個嵌套的字典是這樣的:打印:忽略,如果該鍵是「無」

myDict = { 
    "sample-adaptors": { 
     "banana-mock": { 
      "insts": [ 
       "i-34d425g5" 
      ] 
     } 
    }, 
    "cucumber-test": { 
     "None": { 
      "insts": [ 
       "i-65j3hue6" 
      ] 
     } 
    }, 
    "SampleMonitoring": { 
     "sample-mon-comp": { 
      "insts": [ 
       "i-754mbde" 
      ] 
     }, 
     "None": { 
      "insts": [ 
       "i-981a5134", 
       "i-76a25ge1" 
      ] 
     } 
    } 
} 

從中,我需要制定字符串(S)是這樣的:

EC2.sample-adaptors.banana-mock 
EC2.cucumber-test 
EC2.SampleMonitoring.sample-mon-comp 

也就是說,如果每一秒關鍵不是None它會被添加到與.(點)的字符串,否則不行。這是我來着,到目前爲止....

>>> nStr = lambda s: str({'None':''}.get(s,s)) 
>>> zLen = lambda n: (1 if len(n)>=1 else 0) 
>>> 
>>> for proj in myDict: 
... for comp in myDict[proj]: 
...  print "EC2.{0}{1}".format(proj, ('.'+nStr(comp))*zLen(nStr(comp))) 

這是工作,但不知道是否是這樣做的方式。這兩個嵌套for-loop可以縮短嗎?實際的字典非常大,所以代碼應該足夠高效,以便儘可能快地處理數據。在此先感謝您的幫助。

+0

是字典總是2的深度? – Hyperboreus

+0

等等,你是否指望在字典中訂購? – BlackVegetable

+0

@Hyperboreus:是的,深度應始終爲2。 – MacUsers

回答

1

真的沒有必要lambda表達式時,你可以使用if語句簡單:

for proj, contents in myDict.items(): 
    for comp in contents: 
     if comp == "None": 
      print "EC2.{0}".format(proj) 
     else: 
      print "EC2.{0}.{1}".format(proj, comp) 

請記住,有在字典中沒有順序的保證。如果您想要訂購這些報表,您需要使用collections.OrderedDict

0

有時內涵是比較慢(有時更快)比顯式循環。只要衡量不同的方法。

['EC2.{}'.format(k) if k2 == 'None' else 'EC2.{}.{}'.format(k, k2) for k, v in myDict.items() for k2 in v]