【问题标题】:python defaultdict how can I check if a nested key exists or is [] without creating the keypython defaultdict如何检查嵌套键是否存在或者是[]而不创建键
【发布时间】:2015-10-12 21:44:49
【问题描述】:

在结构 a=defaultdict(lambda: defaultdict(list)) 的嵌套默认字典 a 中有 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 键的情况下过滤掉第三个?

我试过的代码:

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']})

【问题讨论】:

  • if a[i].get("ldap_uidnumber"):?

标签: python dictionary data-structures defaultdict


【解决方案1】:

使用in 检查成员资格不会在默认字典中创建密钥。我会推荐。

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

【讨论】:

  • 谢谢。像魅力一样工作。
【解决方案2】:

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

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

【讨论】:

  • 这里你必须小心,因为你会在第 2 项和第 3 项上输入这个块。我的假设是 OP 正在寻找具有空白的 ldap_uidnumber 键的元素,并试图排除没有该键的元素。
  • @Kasramvd defaultdict.get 将返回默认值 None 除非另有说明...
  • @JonClements 他试图区分不存在的键和空值,尽管None 在这里工作:如果您正在测试缺少的键:if a[i].get('ldap_uidnumber') is None: 并且如果您正在测试一个空值:if not a[i].get('ldap_uidnumber')
  • @Kasramvd 你会遇到的问题是你的默认值恰好等于字典中的值。
  • 好的-我已经更改为空列表的默认值-这样-无论它是否存在(空列表总是不存在)-所以这更接近于模仿@ AdamSmith 在逻辑方面的回答......(例如,如果一个键有一个 None 值 - 使用 None 作为默认值会略有不同)
猜你喜欢
  • 1970-01-01
  • 2012-04-05
  • 1970-01-01
  • 2021-02-28
  • 1970-01-01
  • 2013-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多