Есть ли более простой способ поиска шаблона в списке строк в Python? - PullRequest
2 голосов
/ 26 июня 2019

У меня есть список строк, и мне нужен более удобный способ поиска шаблонов в этом списке. Пример списка:

['red','green','red','red','red','red','green','red','red','green','green','red','green','green','red','red','green','green','green','green','green','green','green','red','red','red','red','red','red','green','red','red','red','red','red','red','red','green','green','red','red','green','red','green','green','green','green','green','red','red','green','green','green','red','green','red','green','red','red','green','green','red','green','green','red','red','green','green','red','red','green','green','green','green','red','red','red','red','red','green','green','green','green','red','green','red','green','red','green','red','red','green','red','green','red','green','red','red','red','red','green','red','red','red','green','green','green','red','red','green','green','red','green','red','green','red','green','green','green']

и выкройки:

BLUE PATTERN:
['red','green','green','green']
['green','red','red','red']

PINK PATTERN:
['red','green','green','red']
['green','red','red','green']

Метод должен отсканировать мой список для шаблонов и сгенерировать другой список с именами шаблонов для того, чтобы шаблоны появились в качестве примера:

['blue','pink','blue','blue',..]

Вот что у меня есть:

catalogacao = []

if len(self._items) < 4:
    return
for i, _ in enumerate(self._items):
    if i + 4 > len(self._items):
        break
    if self._items[i] == "red" and self._items[i+1] == "green" and self._items[i+2] == "green" and self._items[i+3] == "green":
        catalogacao.append("blue")

    if self._items[i] == "green" and self._items[i+1] == "red" and self._items[i+2] == "red" and self._items[i+3] == "red":
        catalogacao.append("blue")

    if self._items[i] == "red" and self._items[i+1] == "green" and self._items[i+2] == "green" and self._items[i+3] == "red":
        catalogacao.append("pink")

    if self._items[i] == "green" and self._items[i+1] == "red" and self._items[i+2] == "red" and self._items[i+3] == "green":
        catalogacao.append("pink")

Ответы [ 3 ]

0 голосов
/ 26 июня 2019

Это немного чище и проще:)

pink = [['red','green','green','green'], ['green','red','red','red']]
blue = [['red','green','green','red'], ['green','red','red','green']]
catalogacao = []

for i in range(len(_items) - 4):
    colors = [x for x in _items[i:i+4]]
    if colors in blue:
        catalogacao.append("blue")
    elif colors in pink:
        catalogacao.append("pink")

Задавайте вопросы! :)

0 голосов
/ 26 июня 2019

почему бы не использовать регулярные выражения?

мы сначала собираем ваши шаблоны в более удобном для машин формате, а затем компилируем их в регулярное выражение:

patterns = (
    (['red','green','green','green'], 'blue'),
    (['green','red','red','red'], 'blue'),
    (['red','green','green','red'], 'pink'),
    (['green','red','red','green'], 'pink'),
)

pattern_dict = {
    ' '.join(words): out  for words, out in patterns
}

pattern_re = re.compile('|'.join(pattern_letters.keys()))

, затем мы можем применить эток вашим товарам:

items = ['red','green','red','red','red','red','green','red','red','green','green','red','green','green','red','red','green','green','green','green','green','green','green','red','red','red','red','red','red','green','red','red','red','red','red','red','red','green','green','red','red','green','red','green','green','green','green','green','red','red','green','green','green','red','green','red','green','red','red','green','green','red','green','green','red','red','green','green','red','red','green','green','green','green','red','red','red','red','red','green','green','green','green','red','green','red','green','red','green','red','red','green','red','green','red','green','red','red','red','red','green','red','red','red','green','green','green','red','red','green','green','red','green','red','green','red','green','green','green']

output = []
for match in pattern_re.finditer(' '.join(items)):
    pat = match.group(0)
    output.append(pattern_dict[pat])
0 голосов
/ 26 июня 2019

Вы можете перебирать свои элементы, и для каждого подсписка из 4 элементов проверьте, равен ли подсписок синему или розовому шаблону

items = ['red','green','red','red','red','red','green','red','red','green','green','red','green','green','red','red','green','green','green','green','green','green','green','red','red','red','red','red','red','green','red','red','red','red','red','red','red','green','green','red','red','green','red','green','green','green','green','green','red','red','green','green','green','red','green','red','green','red','red','green','green','red','green','green','red','red','green','green','red','red','green','green','green','green','red','red','red','red','red','green','green','green','green','red','green','red','green','red','green','red','red','green','red','green','red','green','red','red','red','red','green','red','red','red','green','green','green','red','red','green','green','red','green','red','green','red','green','green','green']

blue_patterns = [['red','green','green','green'], ['green','red','red','red']]

pink_patterns = [['red','green','green','red'], ['green','red','red','green']]

catalogacao = []

#Iterate over the list
for idx in range(len(items)):

    #Check if the 4 element sublist match blue or pink pattern
    if any(item == items[idx:idx+4] for item in blue_patterns):
        catalogacao.append("blue")

    elif any(item == items[idx:idx+4] for item in pink_patterns):
        catalogacao.append('pink')

print(catalogacao)

Выход будет

['blue', 'pink', 'pink', 'pink', 'pink', 'blue', 'blue', 'blue', 'pink', 
'pink', 'blue', 'pink', 'blue', 'pink', 'pink', 'pink', 'pink', 'pink', 
'pink', 'blue', 'blue', 'blue', 'pink', 'blue', 'blue', 'blue', 'pink', 
'pink', 'blue']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...