我正在尝试创建一个函数,该函数返回列表中3个相似连续元素的索引。对于列表[1,2,3,3,3,4,5],输出为myFunc([1,2,3,3,3,4,5])-> 2(或[2] )。
以下代码可以完成这项工作:
def myFunc(a):
lst = []
for i in range(len(a)-2):
if a[i]==a[i+1]==a[i+2]:
lst.append(i)
return lst
...但是检查大列表中的每个元素都很耗时。
代码:
def myFunc(a):
return any(a[i]==a[i+1]==a[i+2] for i in range(len(a)-2))
...对于该问题似乎很有用,但是我不确定是否有办法从中获取相似连续元素的索引(返回True或False)
我的问题: 有没有一种方法可以确定列表中相似的连续元素的索引,而无需使用for循环来检查每个元素?有没有更优雅的方法来解决问题?
答案 0 :(得分:1)
如果列表很长,NumPy可以更快地完成此操作:
import numpy as np
def myFunc(a):
a = np.asarray(a)
matches = (a[:-2] == a[1:-1]) & (a[1:-1] == a[2:])
return np.where(matches)[0][0] # take first match index
这大约比RoadRunner的itertools解决方案快10到400倍(如果输入已经是NumPy数组,则为400倍,否则为10倍)。
答案 1 :(得分:1)
您也可以使用filter
函数在纯Python中完成此操作:
inList = [1,2,3,3,3,4,5]
def showIndices(inList):
return list(filter(lambda i: inList[i] == inList[i+1] == inList[i+2], range(len(inList)-2)))
indices = showIndices(inList)
print(indices)
输出:
[2]
答案 2 :(得分:0)
您可以尝试在此处使用itertools.groupby()
来获取所有索引:
from itertools import groupby
from operator import itemgetter
lst = [1,2,3,3,3,4,5]
length = 3
result = []
for k, g in groupby(enumerate(lst), key=itemgetter(1)):
group = list(g)
if len(group) == length:
result.append((k, list(map(itemgetter(0), group))))
print(result)
哪个以[(number, [indices])]
形式给出元组列表:
[(3, [2, 3, 4])]