Python 从嵌套dict打印:如果键为“忽略”;无”;

Python 从嵌套dict打印:如果键为“忽略”;无”;,python,dictionary,Python,Dictionary,我有这样一个嵌套字典: myDict = { "sample-adaptors": { "banana-mock": { "insts": [ "i-34d425g5" ] } }, "cucumber-test": { "None": { "insts": [ "i-65j3hue6"

我有这样一个嵌套字典:

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
i、 e.如果每秒键不是
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非常大,因此代码应该足够高效,以便尽快处理数据。提前感谢您的帮助。

当您可以使用简单的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)

记住,字典里没有秩序的保证。如果要对这些语句进行排序,则需要使用集合。OrderedDict

有时理解比显式循环慢(有时快)。只是测量不同的方法

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

字典的深度总是2吗?等等,你指望在字典里排序吗?@Hyperboreus:是的,深度应该总是2。