python查找列表中不是“无”的最后一个值的索引

时间:2014-04-09 13:51:46

标签: python list

我有一个包含值和一堆None的列表。例如:

a = ['a', 'b', None, 4, 5, None, 5, 4, None, 7, None, None, None, None]

我正在寻找最快(最短的字符数)方式来查找索引,在本例中为7,最后一个非None值。

9应该是输出。

8 个答案:

答案 0 :(得分:8)

我认为很难打败一些非常明显的东西,比如:

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来自末尾。< / p>

答案 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

答案 2 :(得分:2)

像这样:

max(index for index, item in enumerate(a) if item is not None)

答案 3 :(得分: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)

答案 4 :(得分:1)

你可以用旗帜迭代:

target = 0
for i, val in enumerate(a):
    if val is not None:
        target = i 

答案 5 :(得分:1)

你可以从后面开始检查它是​​否不是。

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)

答案 6 :(得分:1)

试试这个,

>>> 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
>>> 

答案 7 :(得分:1)

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
>>>