生成数组元素,如果在python

时间:2018-01-23 07:08:39

标签: python

检查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]

3 个答案:

答案 0 :(得分:2)

tldr

您自己的代码和三联的答案涵盖了常见案例。我想在你的问题中指出含糊不清。你如何检查“”非常取决于你对空的定义。

这是一个棘手的问题,因为“空”的语义并不完全清楚。假设数据结构是嵌套的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}}