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