我的代码有效,但我想知道是否有更多的pythonic方法可以做到这一点。我有一本字典,我想看看是否:
因此,在我的代码中," 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"存在并且有东西"或更好的方法来做到这一点?
更新 谢谢大家的精彩回答和深思熟虑的评论。有了一些要点和提示,我已经更新了一些问题,因为我没有一些条件也应该成功。我还将示例更改为循环(更容易测试吗?)。
答案 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
如果您的值可以包含False
,0
或其他“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中很自然地涵盖类似假的对象,例如None
,False
,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")