Python 找到列表中最后一个非 "None" 值的索引

2 投票
8 回答
2930 浏览
提问于 2025-04-18 02:02

我有一个列表,里面有一些值,还有很多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 是从后往前的。

撰写回答