在Python中查找列表中某些值的第一个和最后一个索引

Joa*_*nge 60 python search list

是否存在任何内置方法作为列表的一部分,它将为我提供某些值的第一个和最后一个索引,例如:

verts.IndexOf(12.345)
verts.LastIndexOf(12.345)
Run Code Online (Sandbox Code Playgroud)

Sil*_*ost 93

序列有一个index(value)返回第一次出现的索引的方法- 在你的情况下,这将是verts.index(value).

您可以运行它verts[::-1]来查找最后一个索引.在这里,这将是len(verts) - 1 - verts[::-1].index(value)

  • 当然,它将是:len(verts) - 1 - verts [:: - 1] .index(value) (10认同)
  • Btw verts [:: - 1]只是反转列表,对吧?所以我必须补偿指数,对吧? (2认同)

tom*_*sen 26

使用i1 = yourlist.index(yourvalue)i2 = yourlist.rindex(yourvalue).

  • Python _strings_有`rindex`,但是list没有. (28认同)

Ste*_*ann 18

也许找到最后一个索引的两种最有效的方法:

def rindex(lst, value):
    lst.reverse()
    i = lst.index(value)
    lst.reverse()
    return len(lst) - i - 1
Run Code Online (Sandbox Code Playgroud)
def rindex(lst, value):
    return len(lst) - operator.indexOf(reversed(lst), value) - 1
Run Code Online (Sandbox Code Playgroud)

两者都只占用 O(1) 额外空间,并且第一个解决方案的两个就地反转比创建反向副本快得多。让我们将其与之前发布的其他解决方案进行比较:

def rindex(lst, value):
    return len(lst) - lst[::-1].index(value) - 1

def rindex(lst, value):
    return len(lst) - next(i for i, val in enumerate(reversed(lst)) if val == value) - 1
Run Code Online (Sandbox Code Playgroud)

基准测试结果,我的解决方案是红色和绿色的: 未洗牌,全系列

这是用于在包含一百万个数字的列表中搜索一个数字。x 轴是搜索元素的位置:0% 表示它在列表的开头,100% 表示它在列表的末尾。所有解决方案在 100% 位置上都是最快的,这两个reversed解决方案几乎不需要时间,双反向解决方案需要一点时间,而反向复制需要很多时间。

仔细看看右端: 未洗牌,尾部

在位置 100% 处,反向复制解决方案和双反向解决方案将所有时间都花在反转上(index()即时),因此我们看到两个就地反转的速度大约是创建反向副本的 7 倍。

上面是 with lst = list(range(1_000_000, 2_000_001)),它几乎在内存中按顺序创建 int 对象,这对缓存非常友好。让我们在洗牌列表后再做一次random.shuffle(lst)(可能不太现实,但很有趣):

洗牌列表,全系列

洗牌后的列表,尾部

正如预期的那样,一切都变慢了。反向复制解决方案受到的影响最大,在 100% 时,它现在大约需要双反向解决方案的 32 倍 (!)。并且enumerate-solution 现在仅在位置 98% 之后是第二快的。

总的来说,我operator.indexOf最喜欢这个解决方案,因为它是所有地点的后一半或四分之一最快的解决方案,如果你真的在rindex做某事,这可能是更有趣的地点。它只比早期位置的双反向解决方案慢一点。

在 Windows 10 Pro 1903 64 位上使用 CPython 3.9.0 64 位完成的所有基准测试。


小智 12

如果您正在寻找最后一次出现的索引myvaluemylist:

len(mylist) - mylist[::-1].index(myvalue) - 1
Run Code Online (Sandbox Code Playgroud)


Car*_*orc 9

作为一个小帮手功能:

def rindex(mylist, myvalue):
    return len(mylist) - mylist[::-1].index(myvalue) - 1
Run Code Online (Sandbox Code Playgroud)


Eug*_*ash 5

Python 列表具有该index()方法,您可以使用该方法查找列表中某项第一次出现的位置。请注意,当列表中不存在该项目时list.index()会引发ValueError,因此您可能需要将其包装在try/ 中except

try:
    idx = lst.index(value)
except ValueError:
    idx = None
Run Code Online (Sandbox Code Playgroud)

要有效地查找列表中项目最后一次出现的位置(即不创建反向中间列表),您可以使用此函数:

def rindex(lst, value):
    for i, v in enumerate(reversed(lst)):
        if v == value:
            return len(lst) - i - 1  # return the index in the original list
    return None    

print(rindex([1, 2, 3], 3))     # 2
print(rindex([3, 2, 1, 3], 3))  # 3
print(rindex([3, 2, 1, 3], 4))  # None
Run Code Online (Sandbox Code Playgroud)