检查Python中元素是否不存在的正确方法是什么? 该元素预计会在大多数时间出现,如果它是空的,则不是"错误"需要正常处理:
def checkElement(self, x, y):
if not (self.map[x][y]):
self.map[x][y] = 'element {}:{}'.format(x, y)
return self.map[x][y]
答案 0 :(得分:2)
您自己的代码和三联的答案涵盖了常见案例。我想在你的问题中指出含糊不清。你如何检查“空”非常取决于你对空的定义。
这是一个棘手的问题,因为“空”的语义并不完全清楚。假设数据结构是嵌套的dict
,可以从您的示例中推断出来,那么可能是空的意思是内部/外部键未包含在字典中。在那种情况下,你想要与三重奏建议。同样,如果容器是嵌套列表,而不是KeyError
,则会捕获IndexError
。
或者,也可能是“ empty ”意味着字典(或列表)中的内键和外键都是,但该位置的值是“ empty ”的一些能指。在这种情况下,Python中最自然的“空”将是None
,因此您需要检查这些键下的值是否为None
。 <{1}}在布尔表达式中求值为None
,因此您的代码可以正常工作。
但是,根据您的应用程序定义为空的方式,这些不是唯一的选择。如果你正在加载json数据和,那么json的生产者是谨慎的,json中的空值为False
,加载到Python时映射到null
。通常情况下,json的生产者并不谨慎,而空值实际上只是空字符串None
,这种情况发生的次数多于人们所希望的。事实证明{firstName:''}
也适用于这种情况,因为空字符串也会计算为if not self.map[x][y]
,同样适用于空False
,空list
和空{ {1}}。
我们可以进一步概括为空的含义,并说“空”是应用程序未被识别为可操作或有效内容的任何值,因此应被视为“为空” - 但是您已经可以看出这完全取决于应用程序是什么。 set
只包含空格的字符串是否为空,是否部分填充了电子邮件地址为空?
答案 1 :(得分:1)
似乎要求的答案就是
try:
result = self.map[x][y]
except KeyError:
result = 'element {}:{}'.format(x, y)
self.map[x][y] = result
return result
当然,如果self.map[x]
也可能不存在,你必须应用类似的东西;或者可能将其重新定义为defaultdict()
,或者完全取决于其他内容,具体取决于这种结构。
KeyError
对dict有意义;如果self[x]
是列表,则可能会陷阱IndexError
。
答案 2 :(得分:1)
检查是否存在任何对象(列表,Dicts等)的最佳方法是将其包装在
checkElement
块中。您的def checkElement try: self.map[x][y] except: # HANDLE THE CASE WHERE self.map[x][y] ISN'T SET... self.map[x][y] = 'element {}:{}'.format(x, y)
函数可以重写:
{{1}}