Check元素存在于数组中

在PHP中,有一个叫做isset()的函数来检查是否存在一些东西(比如数组索引)并且有一个值。 如何Python?

我需要使用这个数组,因为我有时得到“IndexError:列表索引超出范围”。

我想我可以使用尝试/捕捉,但这是最后的手段。

看你跳跃(LBYL):

 if idx < len(array): array[idx] else: # handle this 

更容易要求宽恕(EAFP):

 try: array[idx] except IndexError: # handle this 

在Python中,EAFP似乎是首选的样式(与通常在C中首选的LBYL相比)。 以下是文档中的一个片段,其中给出了一个示例原因:

在multithreading环境下,LBYL方法可能会在“看”与“跳跃”之间引入竞争条件。 例如,如果密钥映射:如果另一个线程在testing之后但在查找之前从映射中除去密钥,那么返回映射[key]的代码可能会失败。

EAFP与LBYL

我理解你的困境,但是Python不是PHP,编码风格被称为“ 容易请求宽恕”而不是“权限” (简称EAFP )是Python中常见的编码风格

查看源代码(来自文档 ):

EAFP – 比许可更容易要求原谅。 这种常见的Python编码风格假设存在有效的键或属性,并且如果假设certificate是错误的,则捕获exception。 这种干净而快速的风格的特点是存在许多尝试和除了声明。 该技术与许多其他语言如C.的LBYL风格形成对比

因此,基本上, 在这里使用try-catch语句并不是最后的回复,这是一种常见的做法

Python中的“数组”

PHP有关联和非关联数组,Python有列表,元组和字典。 列表与非关联PHP数组相似,字典与关联PHP数组类似。

如果你想检查“数组”中是否存在“key”,那么你必须首先告诉它是什么types的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的方法,这些是你的解决scheme:

  • 对于列表只是检查长度,如果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 
  • 对于可以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 

有帮助吗?

 `e` in ['a', 'b', 'c'] # evaluates as False `b` in ['a', 'b', 'c'] # evaluates as True 

编辑 :澄清,新的答案:

请注意,PHP数组与Python的有很大不同,将数组和字节组合成一个混淆的结构。 Python数组的索引总是从0len(arr) - 1 ,所以你可以检查你的索引是否在这个范围内。 尽pipe如此, try/catch是一个很好的方式来做pythonically。

如果你问的是PHP“数组”(Python的dict )的哈希函数,那么我以前的答案仍然是一种立场:

 `baz` in {'foo': 17, 'bar': 19} # evaluates as False `foo` in {'foo': 17, 'bar': 19} # evaluates as True 

has_key快速高效。

而不是数组使用散列:

 valueTo1={"a","b","c"} if valueTo1.has_key("a"): print "Found key in dictionary" 

您可以使用内build函数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()返回当前范围中的名称列表,更多信息可以在这里find: http : //docs.python.org/library/functions.html#dir 。