Check元素存在于数组中

时间:2011-12-20 03:56:00

标签: python

在PHP中有一个名为isset()的函数来检查某些内容(如数组索引)是否存在且是否有值。 Python怎么样?

我需要在数组上使用它,因为我得到" IndexError:列表索引超出范围"有时。

我猜我可以使用try / catch,但这是最后的手段。

6 个答案:

答案 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)

EAFP与LBYL

我理解你的困境,但Python并不是PHP和称为更容易要求宽恕而不是权限(或简称为EAFP)的编码风格一个常见的编码Python中的风格

查看来源(来自documentation):

  

EAFP - 比许可更容易请求宽恕。这种常见的Python编码风格假设存在有效的键或属性,并且如果假设被证明是错误则捕获异常。这种干净和快速的风格的特点是存在许多try和except语句。该技术与许多其他语言(如C。

)共有的LBYL风格形成对比

所以,基本上,在这里使用try-catch语句不是最后的选择;这是一种常见的做法

Python中的“数组”

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编码风格 - 检查索引的存在

如果您坚持使用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数组始终具有从0len(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]