Самый быстрый способ проверить, присутствует ли шаблон списка в другом списке различной длины? - PullRequest
0 голосов
/ 11 апреля 2020

Предположим, у меня есть список списков различной длины.

list1 = [['0', '0'],['0', '1', '0', ' '],['0', '1', ' ', '0', '1', ' '],['1', '1', ' ', ' ', '1', '1', ' ', '0'],[]]

Я хочу сравнить этот список с другим списком списков:

list2=[['0','0','0','0'],['1','1','1','1']]

Теперь я хочу проверить если list2 содержится в list1. Вывод должен быть True, так как list1 имеет ['1', '1', ' ', ' ', '1', '1', ' ', '0'], который содержит ['1','1','1','1']

Каков наилучший способ проверить, присутствует ли какой-либо из элементов list2 в list1? Ответ должен быть логическим, если какой-либо из элементов list2 найден в list1, сохраняя порядок. Я пробовал довольно много вещей, но не могу получить желаемый результат. Заранее спасибо за предложения.

Ответы [ 2 ]

3 голосов
/ 11 апреля 2020

Это сделает трюк

list1  = [['0', '0'], ['0', '1', '0', ' '], ['0', '1', ' ', '0', '1', ' '], ['1', '1', ' ', ' ', '1', '1', ' ', '0'], []]
list2 = [['0', '0', '0', '0'], ['1', '1', '1', '1']]
for i in list2:
    string2 = ''.join(i)
    for j in list1:    
         string1 = ''.join(j).replace(' ','')
         if string2 in string1:
                 print('yes',i,j)

# output yes ['1', '1', '1', '1'] ['1', '1', ' ', ' ', '1', '1', ' ', '0']
2 голосов
/ 11 апреля 2020

Simplisti c подход:

list1 = [['0', '0'],['0', '1', '0', ' '],['0', '1', ' ', '0', '1', ' '],
         ['1', '1', ' ', ' ', '1', '1', ' ', '0'],[]]
list2 = [['0','0','0','0'],['1','1','1','1']]

# computing the shortened strings once, storing as string,orignal - tuples
texts = [(''.join(inner).replace(" ",""),inner) for inner in list1]
find =  [(''.join(inner).replace(" ",""),inner) for inner in list2]

for (shortened,inner) in texts:
    for (pattern,f) in find:
        if pattern in shortened:
            print("Found", f , "in", inner)

, чтобы получить

Found ['1', '1', '1', '1'] in ['1', '1', ' ', ' ', '1', '1', ' ', '0']

Это просто c, потому что это квадратичный c поиск.

...