Проверка шаблона списка

#python #list

#python #Список

Вопрос:

Я хочу решить одну проблему, связанную с шаблоном списка. У меня есть один список шаблонов, pattern=[‘A’, ‘B’] и один фактический список, Actual =[‘A’, ‘B’, ‘A’,’B’, A’], мне нужно проверить этот ** Фактический элемент списка **, следующий зашаблон списка шаблонов или нет

Условие1:

 let say if Actual=['A','B','A','B','A']
and pattern=['A','B']
if this condition then i will receive in print **yes Actual list follow the pattern of pattern list**
But if Actual==['A','B','A','B','B']
then return **not matching with the pattern of pattern list and Capture the not matching postion and not matching Element of Actual list**.

Similarly for the other repetition of pattern like in condition 2.

Condition 2:
Actual=['X','Y','Z',X','Y']
pattern=['X','Y','Z']
if this condition then i will receive in print **yes Actual list follow the pattern of pattern list**.

but if Actual=['X','Y','Z','Y','Z']
pattern=['X','Y','Z']
if this the then return **not matching with the pattern of pattern list and Capture the not matching postion and not matching Element of Actual list**.

and many more like this.

 

я пытался использовать :

 if Actual==pattern*int(len(Actual)/(len(Pattern))
    return True
else:
    #Capturing the misplace postion in the Actual list.
 

но приведенный выше работает только тогда, когда обе длины фактического списка являются делителями шаблона.

Может ли кто-нибудь предложить мне какой-либо другой подход?

Примечание: длина списка шаблонов может vary.it не всегда 2, как в приведенном выше случае.

Комментарии:

1. Что означает «следовать шаблону списка шаблонов»? Вы имеете в виду, что если шаблон является ABB, то фактическим должен быть один из ABB, ABBABB, ABBABBABB и т. Д.?

2. Здесь список шаблонов — это просто простой список, допустим, вы предполагаете, что X= [‘A’, ‘B’], а шаблон — это в основном шаблон элементов списка.

3. @jarmod я уже упоминал условия в вопросе. пожалуйста, обратитесь к нему.

4. @jarmod если шаблон равен ABB, а заданный список ABBAB соответствует этому условию, я хочу проверить порядок появления шаблона.

Ответ №1:

Это можно решить довольно крутым способом с itertools

 from itertools import cycle, count

def f(actual,pattern):
    return all( a==b for a,b in zip(actual,cycle(pattern))) 

def mismatch(actual, pattern):
    return ( c for a,b,c in zip(actual,cycle(pattern),count()) if a != b)




#Some tests    
assert f(['A','B','A','B','A'],['A','B']) 
assert not f(['A','B','A','B','B'],['A','B']) 

assert list(mismatch(['A','C','A','B','B'],['A','B'])) == [1,4]
 

Функция cycle будет просто повторять шаблон до тех пор, пока он не станет фактическим, а затем all будет проверять элемент за элементом.

Комментарии:

1. Как получить несоответствие позиции или индекса в списке.

2. @Rishav добавил функциональность несоответствия