【发布时间】: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