在PHP中有一个名为isset()
的函数来检查某些内容(如数组索引)是否存在且是否有值。 Python怎么样?
我需要在数组上使用它,因为我得到" IndexError:列表索引超出范围"有时。
我猜我可以使用try / catch,但这是最后的手段。
答案 0 :(得分:94)
在你跳跃之前先看看(LBYL):
if idx < len(array):
array[idx]
else:
# handle this
更容易请求宽恕而非许可(EAFP):
try:
array[idx]
except IndexError:
# handle this
在Python中,EAFP似乎是流行和首选的风格(因为它通常更可靠)。所以,在所有其他条件相同的情况下,我建议您在此用例中使用try
/ except
版本 - 不要将其视为“最后的手段”。
此摘录来自上面链接的官方文档,支持使用try / except流控制:
这种常见的Python编码风格假设存在有效的键或属性,并且如果假设被证明是错误则捕获异常。 这种干净快速的风格的特点是存在许多尝试和除外的陈述。
答案 1 :(得分:43)
我理解你的困境,但Python并不是PHP和称为更容易要求宽恕而不是权限(或简称为EAFP)的编码风格一个常见的编码Python中的风格。
查看来源(来自documentation):
EAFP - 比许可更容易请求宽恕。这种常见的Python编码风格假设存在有效的键或属性,并且如果假设被证明是错误则捕获异常。这种干净和快速的风格的特点是存在许多try和except语句。该技术与许多其他语言(如C。
)共有的LBYL风格形成对比
所以,基本上,在这里使用try-catch语句不是最后的选择;这是一种常见的做法。
PHP具有关联和非关联数组,Python具有列表,元组和字典。列表类似于非关联PHP数组,字典类似于关联PHP数组。
如果你想检查“数组”中是否存在“key”,你必须首先告诉Python它是什么类型,因为当“key”不存在时它们会抛出不同的错误:
>>> l = [1,2,3]
>>> l[4]
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
l[4]
IndexError: list index out of range
>>> d = {0: '1', 1: '2', 2: '3'}
>>> d[4]
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
d[4]
KeyError: 4
如果你使用EAFP编码风格,你应该恰当地捕捉这些错误。
如果您坚持使用LBYL方法,这些是您的解决方案:
列表只检查长度,如果possible_index < len(your_list)
,则your_list[possible_index]
存在,否则不存在:
>>> your_list = [0, 1, 2, 3]
>>> 1 < len(your_list) # index exist
True
>>> 4 < len(your_list) # index does not exist
False
for dictionaries 您可以使用in
关键字,如果possible_index in your_dict
,则your_dict[possible_index]
存在,否则不会:
>>> your_dict = {0: 0, 1: 1, 2: 2, 3: 3}
>>> 1 in your_dict # index exists
True
>>> 4 in your_dict # index does not exist
False
有帮助吗?
答案 2 :(得分:15)
`e` in ['a', 'b', 'c'] # evaluates as False
`b` in ['a', 'b', 'c'] # evaluates as True
编辑:澄清,新答案:
请注意,PHP数组与Python有很大不同,它将数组和数组合并为一个混乱的结构。 Python数组始终具有从0
到len(arr) - 1
的索引,因此您可以检查索引是否在该范围内。不过,try/catch
是一种很好的方式来做到这一点。
如果你问的是PHP“数组”(Python的dict
)的哈希功能,那么我之前的回答仍然有点看法:
`baz` in {'foo': 17, 'bar': 19} # evaluates as False
`foo` in {'foo': 17, 'bar': 19} # evaluates as True
答案 3 :(得分:7)
has_key
快速而有效。
而不是数组使用哈希:
valueTo1={"a","b","c"}
if valueTo1.has_key("a"):
print "Found key in dictionary"
答案 4 :(得分:0)
您可以使用内置函数dir()
来产生与PHP isset()
类似的行为,例如:
if 'foo' in dir(): # returns False, foo is not defined yet.
pass
foo = 'b'
if 'foo' in dir(): # returns True, foo is now defined and in scope.
pass
dir()
返回当前范围内的名称列表,可在此处找到更多信息:http://docs.python.org/library/functions.html#dir。
答案 5 :(得分:0)
在Python中,如果您要求宽恕,您可能会感到有些惊讶。
try-except在这里不是正确的范例。
如果您不小心获得了负指数,您会感到惊讶。
更好的解决方案是自己提供测试功能:
def index_in_array(M, index):
return index[0] >= 0 and index[1] >= 0 and index[0]< M.shape[0] and index[1] < M.shape[1]