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)
tom*_*sen 26
使用i1 = yourlist.index(yourvalue)和i2 = yourlist.rindex(yourvalue).
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
如果您正在寻找最后一次出现的索引myvalue中mylist:
len(mylist) - mylist[::-1].index(myvalue) - 1
Run Code Online (Sandbox Code Playgroud)
作为一个小帮手功能:
def rindex(mylist, myvalue):
return len(mylist) - mylist[::-1].index(myvalue) - 1
Run Code Online (Sandbox Code Playgroud)
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)