我有一个这样的嵌套字典:
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"
]
}
}
}
从中,我需要像这样制定字符串:
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循环可以缩短吗?实际的dict非常大,因此代码应该足够高效,以便尽快处理数据。在此先感谢您的帮助。
答案 0 :(得分:1)
当你可以使用简单的if语句时,实际上不需要lambda表达式:
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
。
答案 1 :(得分:0)
有时理解比显式循环慢(有时更快)。只需衡量不同的方法。
['EC2.{}'.format(k) if k2 == 'None' else 'EC2.{}.{}'.format(k, k2) for k, v in myDict.items() for k2 in v]