Python 找到列表中最后一个非 "None" 值的索引
我有一个列表,里面有一些值,还有很多None
。比如说:
a = ['a', 'b', None, 4, 5, None, 5, 4, None, 7, None, None, None, None]
我想找出一个最快的方法,也就是用最少的字符,来找到这个列表中最后一个不是None
的值的索引。在这个例子里,我想找到7
的索引。
输出应该是9
。
8 个回答
1
我不知道这是否对现在的答案有帮助:
>>> a = ['a', 'b', None, 4, 5, None, 5, 4, None, 7, None, None, None, None]
>>> [i for i,v in enumerate(a) if v is not None][-1]
9
>>>
2
像这样:
max(index for index, item in enumerate(a) if item is not None)
2
使用 reduce 函数:
a = ['a', 'b', None, 4, 5, None, 5, 4, None, 7, None, None, None, None]
reduce(lambda n, i : i if a[i] is not None else n, range(0, len(a)), -1)
6
你可以使用 enumerate
函数来获取一个迭代器,这个迭代器会给你当前的索引和对应的项目。我们在 reversed
a
上使用这个功能。所以,如果 j
不是 None
,我们就返回序列的长度减去当前的索引。我们所有的操作都是用生成器表达式来完成的,因此我们需要用 next
函数来推进它。
print next(len(a) - i for i, j in enumerate(reversed(a), 1) if j is not None)
# 9
9
我觉得有些事情是非常明显的,像下面这个:
def get_last(a):
for i, e in enumerate(reversed(a)):
if e is not None:
return len(a) - i - 1
return -1
需要注意的是,reversed()
只是创建了一个反向迭代器,并没有复制列表。而且因为访问列表的速度很快,所以即使是很大的列表,这种方法也足够用了。
在内部返回的减法是为了补偿 reversed()
让 enumerate()
从输入列表的后面开始遍历,因此循环中的索引 i
是从后往前的。