从嵌套dict打印:如果键为“None”,则忽略

2024-04-29 12:28:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个嵌套字典:

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非常大,因此代码应该足够有效,以便尽可能快地处理数据。事先谢谢你的帮助。你知道吗


Tags: sampletestnoneforec2mockmydictbanana
2条回答

当您可以使用简单的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。你知道吗

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

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

相关问题 更多 >