如何在Python列表中找到某个元素的最后出现位置

120 投票
16 回答
137681 浏览
提问于 2025-04-16 22:36

假设我有这样一个列表:

li = ["a", "b", "a", "c", "x", "d", "a", "6"]

根据我看到的帮助文档,没有一个内置的函数可以直接找到一个字符串最后出现的位置(就像index函数的反向操作)。那么,基本上,我该怎么找到在这个列表中最后一次出现的"a"呢?

16 个回答

20

很多其他的解决方案都需要遍历整个列表,而这个方法不需要。

def find_last(lst, elm):
  gen = (len(lst) - 1 - i for i, v in enumerate(reversed(lst)) if v == elm)
  return next(gen, None)

补充:回头看,这个方法似乎有点复杂。其实我会选择这样做:

def find_last(lst, sought_elt):
    for r_idx, elt in enumerate(reversed(lst)):
        if elt == sought_elt:
            return len(lst) - 1 - r_idx
60

有一个很简单的一行代码,跟Ignacio的差不多,但更简单明了:

max(loc for loc, val in enumerate(li) if val == 'a')

我觉得这个代码非常清晰,而且符合Python的风格:你只需要找到包含匹配值的最高索引。用不到next、lambda、reverse或者itertools这些复杂的东西。

132

如果你只是像你例子中那样使用单个字母,那么 str.rindex 会很方便。 如果找不到这个字母,它会抛出一个 ValueError 错误,这个错误和 list.index 抛出的错误是同一种类型。示例:

>>> li = ["a", "b", "a", "c", "x", "d", "a", "6"]
>>> ''.join(li).rindex('a')
6

对于更一般的情况,你可以在反转后的列表上使用 list.index

>>> len(li) - 1 - li[::-1].index('a')
6

这里的切片操作会创建一个整个列表的 副本。对于短列表来说这样没问题,但如果 li 非常大,使用懒惰的方法会更有效率:

def list_rindex(li, x):
    for i in reversed(range(len(li))):
        if li[i] == x:
            return i
    raise ValueError("{} is not in list".format(x))

一行代码的版本:

next(i for i in reversed(range(len(li))) if li[i] == 'a')

撰写回答