python defaultdict如何在不创建键的情况下检查嵌套键是否存在或是否为[]

python defaultdict如何在不创建键的情况下检查嵌套键是否存在或是否为[],python,dictionary,data-structures,defaultdict,Python,Dictionary,Data Structures,Defaultdict,结构为a=defaultdict(lambda:defaultdict(list))的嵌套defaultdicta中有3种类型的条目 但这不是打印任何内容,而是在代码后面的第三个值中创建键,看起来像 defaultdict(<type 'list'>, {'ldap_uidnumber': [], 'file': ['/home/testuser/.ssh/id_rsa.pub']}) defaultdict(,{'ldap_uidnumber':[],'file':['/home

结构为
a=defaultdict(lambda:defaultdict(list))
的嵌套defaultdict
a
中有3种类型的条目

但这不是打印任何内容,而是在代码后面的第三个值中创建键,看起来像

defaultdict(<type 'list'>, {'ldap_uidnumber': [], 'file': ['/home/testuser/.ssh/id_rsa.pub']})
defaultdict(,{'ldap_uidnumber':[],'file':['/home/testuser/.ssh/id_rsa.pub']})

在中使用
检查成员身份不会在defaultdict中创建密钥。我建议这样做

for i in a:
    if "ldap_uidnumber" in a[i] and      # shortcircuit here in your 3rd el
            not a[i]['ldap_uidnumber']:  # fail here in your 1st el
        # do something

使用
defaultdict.get
,它在缺席时不会创建键,如果键不存在或存在值-
None
[]
在布尔上下文中都是
False
,则返回
None
,因此代码变为:

for i in a:
    if a[i].get('ldap_uidnumber', []):
        # It's not missing or empty - do something...

如果a[i].get(“ldap\u uidnumber”):
?谢谢。工作起来很有魅力。你在这里必须小心,因为你会在第二和第三项上进入这个区块。我的假设是OP正在寻找具有
ldap\u uidnumber
键为空的元素,并试图排除没有该键的元素。@Kasramvd
defaultdict.get
将返回默认值
None
,除非另有说明…@JonClements他试图区分不存在的键和空值,虽然
None
在这里起作用:如果您正在测试缺少的键:
如果[i].get('ldap\u uidnumber')为None:
如果您正在测试空值:
如果不是[i].get('ldap\u uidnumber'))
@Kasramvd您将遇到的问题是,您的默认值恰好等于字典中的值。好的-我已更改为空列表的默认值-这样-无论它是否存在(空列表始终是否定的)-因此这更接近于@AdamSmith在逻辑方面的回答。。。(例如,如果一个键有一个
None
值-使用
None
作为默认值会略有不同)
for i in a:
    if "ldap_uidnumber" in a[i] and      # shortcircuit here in your 3rd el
            not a[i]['ldap_uidnumber']:  # fail here in your 1st el
        # do something
for i in a:
    if a[i].get('ldap_uidnumber', []):
        # It's not missing or empty - do something...