【问题标题】:How to check presence of the element with particular index in the list?如何检查列表中具有特定索引的元素是否存在?
【发布时间】:2015-03-14 21:49:48
【问题描述】:

我提取从第 3 方服务器接收到的数据:

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(result)>=38 和 len(result[38])>=2:

TypeError: 'NoneType' 类型的对象没有 len()

对于结果中的项目[38][2]:

TypeError: 'NoneType' 对象不可迭代

我应该如何修改我的状况?

【问题讨论】:

  • 捕获IndexError 异常可能是解决方案之一。
  • result[38] 的值为 None。
  • 此外,您可以检查 result[38] 的类型 list。像 if result and len(result)>=38 and type(result[38]) == list and len(result[38])>=2: 一样,但我建议您使用 try/catch 块捕获可能的异常,例如 IndexErrorTypeError

标签: python


【解决方案1】:

您的result[38] 值为None,而len(result[38]) 失败,因为None 单例没有长度。即使不是None,您的测试也可能会失败,因为您需要 39 元素才能使索引 38 存在,但您只测试是否至少有 38 个元素。如果恰好有 38 个元素,您的 len(result) >= 38 测试将是正确的,但您仍然会得到 IndexError

使用异常处理,而不是测试每个元素:

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:

【讨论】:

  • 异常不能用作流控制元素。最好在使用元素之前对其进行测试。
  • @PacoAbato 你一定是 Python 新手:docs.python.org/2/glossary.html#term-eafp
  • @PacoAbato:Python 不是 Java 或 C++。在 Python 中,使用异常进行流控制是一个很棒的主意。它使代码更具可读性和更健壮,前提是您使用它仅捕获特定异常。
  • @PacoAbato:Python 中的异常处理很便宜,通常比在这样的嵌套结构中测试每个元素更便宜。在其他语言中,异常处理相对昂贵,因此不鼓励使用。
  • 我想这是风格问题。恕我直言,使用异常作为流控制使代码更容易编写但更难阅读。如果python风格是使用它们,好吧我不会再抱怨了,但我会写一个检查函数并在使用结果对象之前调用它。
猜你喜欢
  • 1970-01-01
  • 2012-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-20
  • 2019-10-04
  • 1970-01-01
相关资源
最近更新 更多