从嵌套字典打印:如果键是“无”则忽略

时间:2014-02-11 17:40:34

标签: python dictionary

我有一个这样的嵌套字典:

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非常大,因此代码应该足够高效,以便尽快处理数据。在此先感谢您的帮助。

2 个答案:

答案 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]