在列表/数组索引处获取值,如果在Python中超出范围,则获取“无”

Get value at list/array index or “None” if out of range in Python

如果索引在python中超出或范围,是否有清晰的方法获取列表索引或None的值?

显而易见的方法是:

1
2
3
4
if len(the_list) > i:
    return the_list[i]
else:
    return None

但是,冗长的内容会降低代码的可读性。有没有一个干净,简单,一个衬垫可以代替?


尝试:

1
2
3
4
try:
    return the_list[i]
except IndexError:
    return None

或者,一个衬里:

1
l[i] if i < len(l) else None

例子:

1
2
3
4
5
6
7
>>> l=range(5)
>>> i=6
>>> print(l[i] if i < len(l) else None)
None
>>> i=2
>>> print(l[i] if i < len(l) else None)
2


我发现列表切片很适合:

1
2
3
4
5
6
7
>>> x = [1, 2, 3]
>>> a = x [1:2]
>>> a
[2]
>>> b = x [4:5]
>>> b
[]

所以,如果你想要x[i],总是访问x[i:i+1]。您将得到一个包含必需元素(如果存在)的列表。否则,您将得到一个空列表。


1
return the_list[i] if len(the_list) > i else None


出于您的目的,您可以排除else部分,因为如果不满足给定条件,None将默认返回。

1
2
def return_ele(x, i):
    if len(x) > i: return x[i]

结果

1
2
3
4
5
6
7
8
>>> x = [2,3,4]
>>> b = return_ele(x, 2)
>>> b
4
>>> b = return_ele(x, 5)
>>> b
>>> type(b)
<type 'NoneType'>


如果处理的是小列表,则不需要添加if语句或类似的内容。一个简单的解决方案是将列表转换为dict,然后可以使用dict.get

1
2
table = dict(enumerate(the_list))
return table.get(i)

甚至可以使用dict.get的第二个参数设置另一个默认值,而不是None。例如,如果索引超出范围,使用table.get(i, 'unknown')返回'unknown'

请注意,此方法不适用于负指数。