测试字典键是否存在,不为空且不为空

新手上路,请多包涵

我有有效的代码,但我想知道是否有更多的 pythonic 方法来执行此操作。我有一本字典,我想看看是否:

  • 存在一个键
  • 该值不是 None(在这种情况下来自 SQL NULL)
  • 该值不只是引用(空白?)
  • 该值不仅仅由空格组成

所以在我的代码中,“a”、“b”和“c”的键会成功,这是正确的。

 import re

mydict = {
"a":"alpha",
"b":0,
"c":False,
"d":None,
"e":"",
"g":"   ",
}

#a,b,c should succeed
for k in mydict.keys():
    if k in mydict and mydict[k] is not None and not re.search("^\s*$", str(mydict[k])):
        print(k)
    else:
        print("I am incomplete and sad")

我上面的内容有效,但这似乎是一组非常长的条件。也许这只是正确的解决方案,但我想知道是否有更 pythonic 的“存在并且有东西”或更好的方法来做到这一点?

更新 谢谢大家的精彩回答和深思熟虑的评论。有了一些要点和技巧,我对问题进行了一些更新,因为有些条件我没有,但也应该成功。我还将示例更改为循环(更容易测试,对吧?)。

原文由 sniperd 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 581
2 个回答

尝试获取值并将其存储在变量中,然后使用对象“truthyness”进一步处理该值

v = mydict.get("a")
if v and v.strip():

  • 如果 "a" 不在字典中, get 返回 None 并且第一个条件失败
  • if "a" is in the dict but yields None or empty string, test fails, if "a" yields a blank string, strip() returns falsy字符串,它也失败了。

让我们测试一下:

 for k in "abcde":
    v = mydict.get(k)
    if v and v.strip():
        print(k,"I am here and have stuff")
    else:
        print(k,"I am incomplete and sad")

结果:

 a I am here and have stuff
b I am incomplete and sad    # key isn't in dict
c I am incomplete and sad    # c is None
d I am incomplete and sad    # d is empty string
e I am incomplete and sad    # e is only blanks

如果您的值可以包含 False0 或其他“虚假”非字符串,您必须测试字符串,在这种情况下替换:

 if v and v.strip():

经过

if v is not None and (not isinstance(v,str) or v.strip()):

所以条件匹配如果不是 None 并且不是字符串(所有匹配)或者如果是字符串,则字符串不为空。

原文由 Jean-François Fabre 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以将列表推导式与 str.strip 结合使用,以解决字符串中的空格问题。

使用 if v 在 Python 中很自然地覆盖类似 False 的对象,例如 NoneFalse ,所以 0 note 仅 在 0 等情况下有效 _可接受的价值_。

 res = [k for k, v in mydict.items() if (v.strip() if isinstance(v, str) else v)]

['a']

原文由 jpp 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题