Python中检查字典字段是否为None的判断条件不符合预期
判断条件的核心逻辑偏差
你现在的判断写法从根上搞反了保留规则的触发逻辑,主要有两个问题:
- 逻辑运算符搭配错误
你的保留需求是两个条件同时满足才留:目标键的值既不是空字符串、也不是None。
但你当前写的判断是items['Anotherfield']!= '' or items['Anotherfield'] is None,用的是「或」逻辑——只要两个判断分支满足任意一个,就会把字典项追加到新列表里:- 当值为
None时:None != ''的结果是True,第一个判断分支直接命中,整项被保留,完全没被拦截 - 当值为空字符串
''时:'' != ''是False,同时空字符串不是None,第二个判断也为False,两个分支都不触发,空字符串的项被正常排除
这就是你遇到的“空字符串判断生效、但None拦不住”的原因:你整个判断的实际效果是「只要值不是空字符串,不管是不是None都保留」,根本没把None纳入排除范围。
- 当值为
- 代码笔误
原定义的data列表里最后一个字典多打了一个右大括号:{'Field': 'somevalue', 'Anotherfield': None}},实际运行会触发语法错误,属于书写时的手滑问题。
修正后的实现代码
把判断逻辑改成「用且连接两个正向保留条件」即可:
data = [ {'Field': 'somevalue', 'Anotherfield': 'somevalue'}, {'Field': 'somevalue', 'Anotherfield': ''}, {'Field': 'somevalue', 'Anotherfield': None} ] datanew = [] for items in data: # 仅当值既不是空字符串、也不是None时,才保留当前字典 if items['Anotherfield'] != '' and items['Anotherfield'] is not None: datanew.append(items)
运行后得到的结果就和预期一致:datanew = [{'Field': 'somevalue', 'Anotherfield': 'somevalue'}]
补充提醒:不要图省事直接写
if items['Anotherfield']做过滤,这种写法会把所有Python判定为假值的类型(比如数值0、布尔值False、空列表等)也一并排除,不符合你明确提出的「仅排除空字符串和None」的规则。
内容的提问来源于stack exchange,提问作者Bilal Hakim
相关产品推荐
相关产品推荐

