Python 如何检查列表中是否存在具有特定索引的元素?
我提取从第三方服务器接收的数据:Python 如何检查列表中是否存在具有特定索引的元素?,python,Python,我提取从第三方服务器接收的数据: data = json.loads(response) if data: result = data.get('result') if result and len(result)>=38 and len(result[38])>=2: for item in result[38][2]: ... 该条件的思想是检查列表是否包含索引为38的元素(result[38])和索引为2的子元素(result
data = json.loads(response)
if data:
result = data.get('result')
if result and len(result)>=38 and len(result[38])>=2:
for item in result[38][2]:
...
该条件的思想是检查列表是否包含索引为38的元素(result[38]
)和索引为2的子元素(result[38][2]
),但看起来它不起作用,因为我得到了以下异常-
如果结果和len(结果)>=38和len(结果[38])>=2:
TypeError:类型为“NoneType”的对象没有len()
或
对于结果[38][2]中的项目:
TypeError:“非类型”对象不可编辑
如何修改我的条件?您的
结果[38]
值为None
,并且len(结果[38])
失败,因为None
单例没有长度。即使它不是None
,您的测试也可能失败,因为您需要39个元素才能存在索引38,但您只能在至少有38个元素时进行测试。如果正好有38个元素,您的len(result)>=38
测试将为真,但仍然会得到一个索引器
使用异常处理,而不是测试每个元素:
data = json.loads(response)
try:
for item in data['result'][38][2]:
# ...
except (KeyError, TypeError, IndexError):
# either no `result` key, no such index, or a value is None
pass
这比测试所有中间元素要简单得多:
if result and len(result) > 38 and result[38] and len(result[38]) > 2:
捕获索引器
异常可能是解决方案之一。结果[38]
的值为无。此外,您可以检查结果[38]
的类型列表
。像如果result和len(result)>=38,type(result[38])==list和len(result[38])>=2:
但是我建议您使用try/catch
实现块捕获可能的异常,比如索引器
和类型错误
。异常不能用作流控制元素。在使用之前最好先测试元素。Paoababto必须是Python的新的:Paoababto:Python不是java或C++。在Python中,使用异常进行流控制是一个非常好的想法。它使代码更具可读性和健壮性,只要您使用它来捕获特定的异常。@PacoAbato:Python中的异常处理成本很低,通常比测试嵌套结构中的每个元素都要低。在其他语言中,异常处理相对昂贵,因此不鼓励使用。我想这是风格的问题。IMHO使用异常作为流控制使代码更容易编写,但更难阅读。如果python风格使用它们,那么我不会再抱怨了,但是我会编写一个check函数并在使用result对象之前调用它。