Check元素存在于数组中

Jon*_*nny 63 python

在PHP中有一个函数调用isset()来检查某些东西(如数组索引)是否存在并具有值.Python怎么样?

我需要在数组上使用它,因为我有时会得到"IndexError:list index out of range".

我想我可以使用try/catch,但这是最后的选择.

wim*_*wim 102

在你跳跃之前看(LBYL):

if idx < len(array):
    array[idx]
else:
    # handle this
Run Code Online (Sandbox Code Playgroud)

比许可更容易请求宽恕(EAFP):

try:
    array[idx]
except IndexError:
    # handle this
Run Code Online (Sandbox Code Playgroud)

在Python中,EAFP似乎是流行和首选的风格(因为它通常更可靠).所以,在所有其他条件相同的情况下,我建议在这个用例中使用try/ exceptversion - 不要将它视为"最后的手段".

这段摘录来自上面链接的官方文档,支持使用try/except流控制:

这种常见的Python编码风格假设存在有效的键或属性,并且如果假设被证明是错误则捕获异常.这种干净和快速的风格的特点是存在许多try和except语句.

  • 一堆其他答案看起来也是正确的,但这个答案简洁而且内容丰富.然后我再也没有要求宽恕. (4认同)

Tad*_*eck 45

EAFP与LBYL

我理解你的困境,但Python并不是PHP和称为宽容的编码风格,而不是Permission(或简称EAFP)是Python中常见的编码风格.

查看来源(来自文档):

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
Run Code Online (Sandbox Code Playgroud)

如果您使用EAFP编码样式,您应该恰当地捕获这些错误.

LBYL编码风格 - 检查索引的存在

如果您坚持使用LBYL方法,这些是您的解决方案:

  • 对于列表只检查长度和if 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
    
    Run Code Online (Sandbox Code Playgroud)
  • 对于字典,您可以使用in关键字if 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
    
    Run Code Online (Sandbox Code Playgroud)

它有帮助吗?


Ama*_*dan 15

`e` in ['a', 'b', 'c']  # evaluates as False
`b` in ['a', 'b', 'c']  # evaluates as True
Run Code Online (Sandbox Code Playgroud)

编辑:澄清,新答案:

请注意,PHP数组与Python有很大不同,它将数组和数组合并为一个混乱的结构.Python的数组总是有指数从0len(arr) - 1,这样你就可以检查你的索引是否是在这个范围内.try/catch但是,这是一个很好的方式来进行pythonically.

如果你问的是PHP"数组"(Python dict)的哈希函数,那么我以前的答案仍然有点看法:

`baz` in {'foo': 17, 'bar': 19}  # evaluates as False
`foo` in {'foo': 17, 'bar': 19}  # evaluates as True
Run Code Online (Sandbox Code Playgroud)


小智 7

has_key 快速高效.

而不是数组使用哈希:

valueTo1={"a","b","c"}

if valueTo1.has_key("a"):
        print "Found key in dictionary"
Run Code Online (Sandbox Code Playgroud)

  • ``AttributeError:'set'对象没有属性'has_key' (2认同)