获取列表中相似连续元素的索引(Python3)

时间:2018-07-22 08:16:11

标签: python python-3.x list

我正在尝试创建一个函数,该函数返回列表中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循环来检查每个元素?有没有更优雅的方法来解决问题?

3 个答案:

答案 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])]