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数组的索引总是从0
到len(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 。