[英]python find the index of the last value in a list that is not a “None”
我有一个值列表和一堆None
。 例如:
a = ['a', 'b', None, 4, 5, None, 5, 4, None, 7, None, None, None, None]
我正在寻找最快(最短的字符数)方式来找到索引,在本例中为7
,最后一个非None
值。
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
来自结尾。
您可以使用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
像这样:
max(index for index, item in enumerate(a) if item is not None)
使用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)
你可以用标志迭代:
target = 0
for i, val in enumerate(a):
if val is not None:
target = i
你可以从后面开始检查它是否不是None。
x = next(x for x in reversed(seq) if x is not None)
编辑:我意识到你在寻找索引,而不仅仅是价值。 上面的代码仅给出序列中最后一个非None元素的值。
您可以添加枚举器来获取索引。
next(len(seq) - i for i, j in enumerate(reversed(seq), 1) if j is not None)
尝试这个,
>>> a = ['a', 'b', None, 4, 5, None, 5, 4, None, 7, None, None, None, None]
>>> last_index=0
>>> for index, i in enumerate(a):
if i is not None:
last_index= index
>>> last_index
9
>>>
Donno id这为当前的答案池添加了任何内容:
>>> 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
>>>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.