Python: найдите индекс списка кулаков в списке oneliner

Здесь решение найти индекс списка y в большом списке x

def getsubidx(x, y):
 l1, l2 = len(x), len(y)
 for i in range(l1):
 if x[i:i+l2] == y:
 return i

Можно ли преобразовать это в oneliner, используя itertools, фильтр или что-то еще?

3 ответа

def getsubidx(x, y):
 return next(i for i in range(len(x)) if x[i:i+len(y)] == y)

Возможно, вы захотите, чтобы возникла ошибка, если нет совпадения, если вы не можете вернуть -1

return next((i for i in range(len(x)) if x[i:i+len(y)] == y), -1)


Можно ли преобразовать это в oneliner, используя itertools, фильтр или что-то еще?

Здесь "somethng else" вы можете использовать index(subseq, seq):

index_of_y_in_x = index(y, x)


def getsubidx(x, y):
 l1, l2 = len(x), len(y)
 for i in range(l1-l2): here it should be l1-l2
 if x[i:i+l2] == y: here you may get list out of index
 return i

один лайнер:

def getsubidx(x, y):
 return [i for i in range(len(x)-len(y)) if x[i:i+len(y)] == y]

licensed under cc by-sa 3.0 with attribution.