Найти дополнительный список внутри списка в python

У меня есть список номеров

l = [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0] [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] [0, 0, 0, 0, 0, 1, 0, 0, 0, 0] [0, 0, 2, 1, 1, 2, 0, 0, 0, 0] [0, 0, 2, 1, 1, 2, 2, 0, 0, 1] [0, 0, 1, 2, 2, 0, 1, 0, 0, 2] [1, 0, 1, 1, 1, 2, 1, 0, 2, 1]] 

Например, я должен искать шаблон «2,1,1,2», как мы видим, это присутствует в строках 6 и 7. чтобы найти эту последовательность, я попытался преобразовать каждый список в str и попытался выполнить поиск по шаблону, но по какой-то причине код не работает.

 import re for i in l: if re.search('2,1,1,2' , str(i).strip('[').strip(']')): print " pattern found" 

я что-то пропустил здесь?

Преобразование списка в строку – это не очень хорошая идея.

Как насчет чего-то вроде этого:

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

Я предлагаю вам использовать алгоритм Кнута-Морриса-Пратта . Я предполагаю, что вы неявно предполагаете, что ваш шаблон присутствует в списке всего один раз, или вам просто интересно узнать, включено ли оно или нет.

Если вам нужен список каждого первого элемента, который запускает последовательность, вы можете использовать KMP. Подумайте об этом как о файле string.find () для списков.

Я надеюсь, это поможет.

 l = [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 2, 1, 1, 2, 0, 0, 0, 0], [0, 0, 2, 1, 1, 2, 2, 0, 0, 1], [0, 0, 1, 2, 2, 0, 1, 0, 0, 2], [1, 0, 1, 1, 1, 2, 1, 0, 2, 1]] import re for i in l: if re.search('2, 1, 1, 2' , str(i).strip('[').strip(']')): print " pattern found" 

str(list) вернет строку с пробелами между элементами … Вы должны искать '2, 1, 1, 2' вместо 2,1,1,2

Вот та же идея, без регулярного выражения

 data = [ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 2, 1, 1, 2, 0, 0, 0, 0], [0, 0, 2, 1, 1, 2, 2, 0, 0, 1], [0, 0, 1, 2, 2, 0, 1, 0, 0, 2], [1, 0, 1, 1, 1, 2, 1, 0, 2, 1], ] pattern = '2112' for item in data: line = '' for number in item: line += str(number) if pattern in line: print 'pattern found: %s' % item