Python:如何在不获取IndexError的情况下检查不存在的列表元素的值?

时间:2015-06-08 19:03:46

标签: python list if-statement indexing indexoutofboundsexception

我正在使用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的单行条件?

2 个答案:

答案 0 :(得分:8)

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

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

如果前两个元素缺失或者您有超过3个元素,则无关紧要。重要的是列表足够长,首先要有第3个元素。

答案 1 :(得分: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]