python defaultdict如何在不创建密钥

时间:2015-10-12 21:44:50

标签: python dictionary data-structures defaultdict

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

for i in a:
    print a[i]

defaultdict(<type 'list'>, {'ldap_uidnumber': [['10002']], 'file': ['ABC', 'xyz']})
defaultdict(<type 'list'>, {'ldap_uidnumber': [], 'file': ['abcd']})
defaultdict(<type 'list'>, {'file': ['/home/testuser/.ssh/id_rsa.pub']})
  1. 如何使用ldap_uidnumber: []过滤掉第二个?
  2. 如何在没有键ldap_uidnumber的情况下过滤掉第三个?
  3. 我试过的代码:

    for i in a:
        if a[i]["ldap_uidnumber"] and a[i]["ldap_uidnumber"] == []:
            print i
    

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

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

2 个答案:

答案 0 :(得分:4)

使用defaultdict.get在缺席时不会创建密钥,如果密钥不存在则返回None,如果存在则返回值None和{{ 1}}在布尔上下文中都是[],因此您的代码变为:

False

答案 1 :(得分:3)

使用in检查成员身份不会在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