2017-01-31 2 views
-2

Скажите, что есть список под названием PatternList = ['b', 0, 'e', 0]. Как я могу проверить, есть ли в другом списке CompareList = ['r', 't', 'y', 'b', 'i', 'e', 'y', 'b', 't', 'e', 'r', 't', 'b', 'w', 't', 'e'] шаблон, содержащийся в PatternList, и сколько раз?Python искать соответствие в списках

В этом случае результат будет 2, а CompareList = [ 'R', 'т', 'Y', 'B', 'Я', 'е' ', у, ' b ', t, ' e ',' r ',' t ',' b ',' w ',' t ',' e '].

Примечание: PatternList может быть прочитан как «b», любой символ, «e», любой символ.

+0

им не уверен, что кто-нибудь знает, что ты просить, потому что вы говорите, вы хотите увидеть, если шаблон во втором списке, но тогда он выглядит так, как вам хочется, если какое-либо из значений появляется во втором списке – WhatsThePoint

+0

0 означает любой символ? что, если 'PatternList = ['b', 'i', 'b', 't']'? – dnit13

+0

Элементы вашего шаблона и списки сравнения всегда состоят из отдельных символов? Прямо сейчас, ваш пример кода не является даже допустимым Python, поэтому трудно догадаться, что вы на самом деле ищете. –

ответ

-1

Это вы имели в виду? Вы можете использовать списковые:

>>> x = [1,2,3] 
    >>> y = [0,2,5,7,4,3] 
    >>> [i for i in x if i in y] 
    [2, 3] 

Edit:

>>> len(set([i for i in x if i in y])) 
2 
>>> 
+0

@leaf Плохо, я не читал внимательно. –

2

Вы можете сделать что-то подобное с регулярным выражением:

import re 

l = ["b", "0", "e", "0"] 
cl = ["r", "t", "y", "b", "i", "e", "y", "b", "t", "e", "r", "t", "b", "w", "t", "e"] 

print re.findall(''.join(l).replace('0','.'), ''.join(cl)) 
print len(re.findall(''.join(l).replace('0','.'), ''.join(cl))) 

Выход:

['biey', 'bter'] 
2 

Идея:

  1. Регистрация элементов в l и заменить 0 с ., чтобы соответствовать любому символу в cl.
  2. Соедините элементы в cl.
  3. ли re.findall(res_of_step1, res_step_2)
+0

Вы избили меня при размещении того же решения - :) – dnit13

+0

У вас немного другое, учитывая, что 0 - это int. Вы также можете сделать «.» .join (map (str, a)). Replace ('0', '.') ' – MYGz

+0

@MYGz это выглядит довольно хорошо, но я получаю эту ошибку:« AssertionError: извините, но это версия поддерживает только 100 названных групп ». Есть ли обходной путь? –

1

Это выглядит довольно просто, когда вы преобразовать это регулярное выражение:

a=['b', 0, 'e', 0] 
a1 = ['.' if i==0 else i for i in a] 
>>> a1 
['b', '.', 'e', '.'] 
>>> a2 = ''.join(a1) 
compareList = ['r', 't', 'y', 'b', 'i', 'e', 'y', 'b', 't', 'e', 'r', 't', 'b', 'w', 't', 'e'] 
>>> compare_string=''.join(compareList) 
>>> len(re.findall(a2, compare_string)) 
2 
+0

Кстати, измените свой список 'a'. Третий элемент должен быть 'e', чтобы получить 2 совпадения. – MYGz

+0

@MYGz Скопировано неправильно с терминала, Thnx - :) – dnit13

Смежные вопросы