#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 добавил функциональность несоответствия