【问题标题】:Python: How to check the value of a non-existent list element without getting IndexError?Python:如何在不出现 IndexError 的情况下检查不存在的列表元素的值?
【发布时间】:2015-08-23 09:18:36
【问题描述】:

我正在使用 Python 的单行条件:

x = 'foo' if myList[2] is not None else 'bar'

为x分配列表某个索引处的项目的值 - 当且仅当它存在时 - 如果不存在,则分配不同的值。

这是我的挑战:myList 最多可以包含三个元素,但并不总是三个。因此,如果索引不存在(即,如果有问题的索引比列表的大小大 1+),我显然会在内联条件分配变量之前得到一个 IndexError list out of range:

In [145]: myList = [1,2]

In [146]: x = 'foo' if myList[2] is not None else 'bar'
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-146-29708b8c471e> in <module>()
----> 1 x = 'foo' if myList[2] is not None else 'bar'

IndexError: list index out of range

事先检查列表的长度并不是一个真正的选择,因为我不知道我感兴趣的值丢失了(即myList 可能会丢失三个可能值中的任何一个或全部。知道它只包含一个、两个或三个元素没有帮助)。

更新:我无法根据列表的长度进行分配的原因如下。该列表的最大大小为 3,并且顺序很重要。填充的值将是对 API 的三个单独调用的结果。如果对 API 的所有调用都成功,我会得到一个完整的列表,一切都很好。然而,如果只有两个返回值,则列表仅包含两个项目,但 我不知道哪个 API 调用导致了丢失的项目,所以分配变量是运气。

所以,长话短说:如何在保持 Python 的单行条件的同时检查某个索引处不存在的列表项?

【问题讨论】:

  • 你得到一个索引错误不是因为你不能分配值,而是因为列表没有那个索引。
  • 我不确定您为什么认为测试长度不是一种选择。当然这是一个选项,IndexError 仅在列表短于长度 3 时才会出现。
  • 您说您想“将列表的某个索引处的项目的值分配给 x”,但这不是您想要做的。如果值不是None,则您尝试分配“foo”,否则分配“bar”。我认为为myList 提供一些示例值以及为x 提供相应的所需值会对您有所帮助。
  • 我已经知道为什么不能赋值了。这就是问题的本质:试图检查不存在的项目的价值。因此,我在上面的更新中说明了为什么使用列表的长度不可靠。

标签: python list if-statement indexing indexoutofboundsexception


【解决方案1】:

只测试是否有足够的元素:

x = 'foo' if len(myList) > 2 and myList[2] is not None else 'bar'

如果缺少前 2 个元素或者您有 3 个以上的元素,则无关紧要。重要的是列表足够长,可以首先包含第三个元素。

【讨论】:

  • 问题是如果 len(myList) 为 2,或者 len(myList) 为 1,我不知道为什么(即我不知道缺少哪个值),所以分配基于长度(以及存在的任何值)的变量是在黑暗中拍摄的。
  • @Pyderman:那是你如何构建该列表的问题。这些是 Python 无法解决的问题。您需要构建代码以避免将值放置在任意索引处。
  • 值没有被放置在任意索引处。事实上,秩序很重要,而事实正是如此,这很可能导致了这个问题。
  • @Pyderman:但是如果您省略了第一个值,那么之后的所有内容都会向上移动一个位置,您无法再确定 myList[0] 是第一个值还是第二个值,因为first 被省略了。
  • 是的。这里真正的问题是我将三个 API 调用的值放入一个列表中,并在单个 getAllTheApiValues() 类型函数中返回该列表。然后尝试访问(并根据)该列表的元素。为了简洁起见,我返回了一份清单,但它似乎造成的麻烦多于其价值。所以我现在制作了三个函数,每个函数都从 API 中返回适当的值。更多的代码行。更少的头痛。如果你能提出一个更聪明的方法,我会全力以赴。感谢您的意见。
【解决方案2】:

使用尝试。

#!/usr/bin/python
# -*- coding: utf-8 -*-

L=[1,2,3]

i=0
while i < 10:
    try:
        print L[i]

    except IndexError as e:
        print e, 'L['+str(i)+']'

    i += 1

输出

1
2
3
list index out of range L[3]
list index out of range L[4]
list index out of range L[5]
list index out of range L[6]
list index out of range L[7]
list index out of range L[8]
list index out of range L[9]

【讨论】:

  • 好风格,程序员应该添加异常处理。点赞
猜你喜欢
  • 2021-04-23
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-14
  • 2017-07-12
相关资源
最近更新 更多