如何在Python列表中找到某个元素的最后出现位置
假设我有这样一个列表:
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')