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

时间:2018-05-03 13:42:28

标签: python python-3.x dictionary

我的代码有效,但我想知道是否有更多的pythonic方法可以做到这一点。我有一本字典,我想看看是否:

  • 存在密钥
  • 该值不是无(在这种情况下来自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"存在并且有东西"或更好的方法来做到这一点?

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

6 个答案:

答案 0 :(得分:7)

尝试获取值并将其存储在变量中,然后使用对象“truthyness”继续使用值

v = mydict.get("a")
if v and v.strip():
  • 如果"a"不在dict中,get会返回None并且第一个条件失败
  • 如果"a"在dict中但产生None或空字符串,则测试失败,如果"a"产生空字符串,strip()将返回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或其他“falsy”非字符串,则必须测试字符串,在这种情况下替换:

if v and v.strip():

通过

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

所以条件匹配,如果不是None并且不是字符串(一切都匹配)或者如果是字符串,则该字符串不是空白。

答案 1 :(得分:2)

您可以使用str.strip列表推导来计算字符串中的空格。

使用if v在Python中很自然地涵盖类似假的对象,例如NoneFalse,0等。请注意,如果0不是可接受的值,则仅适用

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

['a']

答案 2 :(得分:1)

用于检查密钥是否存在的get方法在迭代密钥方面更有效。它使用与O(1)相关的O(n)复杂度检查密钥是否存在而不进行迭代。我首选的方法看起来像这样:

if mydict.get("a") is not None and str(mydict.get("a")).replace(" ", "") != '':
    # Do some work

答案 3 :(得分:1)

我有2条建议可以为您提供,特别是如果您的主要问题是条件的长度。

第一个用于检查密钥是否在dict中。您无需使用"a" in mydict.keys()即可使用"a" in mydict

使条件变小的第二个建议是分解为存储为布尔值的较小条件,并在最终条件下检查这些条件:

import re

mydict = {
"a":"alpha",
"c":None,
"d":"",
"e":"   ",
}

inKeys = True if "a" in mydict else False
isNotNone = True if mydict["a"] is not None else False
isValidKey = True if not re.search("^\s*$", mydict["a"]) else False

if inKeys and isNotNone and isValidKey:
    print("I am here and have stuff")
else:
    print("I am incomplete and sad")

答案 4 :(得分:0)

cond是一个生成器函数,负责使用all函数生成以短路方式应用的条件。鉴于d = cond()next(d)将检查dict中是否存在,依此类推,直到没有条件适用,在这种情况下,all(d)将评估为True。< / p>

mydict = {
  "a":"alpha",
  "c":None,
  "d":"",
  "e":"   ",
}

def cond ():
  yield 'a' in mydict
  yield mydict ['a']
  yield mydict ['a'].strip ()

if all (cond ()):
    print("I am here and have stuff")
else:
    print("I am incomplete and sad")

答案 5 :(得分:0)

它确切地检查了NoneType None

from types import NoneType # dont forget to import this

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

#a,b,c should succeed
for k in mydict:
    if type(mydict[k]) != NoneType:
        if type(mydict[k]) != str or type(mydict[k]) == str and mydict[k].strip():
            print(k)
        else:
            print("I am incomplete and sad")
    else:
        print("I am incomplete and sad")