проверить, есть ли образец в списке слов - PullRequest
0 голосов
/ 11 ноября 2018

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

words = ['hatch','catch','match','chat','mates'] 
pattern = '_atc_

необходим вывод:

['hatch','match']

Я пытался использовать вложенные циклы, но это не сработало для шаблона, который начинается и заканчивается '_'

def filter_words_list(words, pattern):
relevant_words = []
for word in words:
    if len(word) == len(pattern):
        for i in range(len(word)):
            for j in range(len(pattern)):
                if word[i] != pattern[i]:
                    break
                if word[i] == pattern[i]:
                    relevant_words.append(word)

спасибо!

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

Так что вы должны использовать регулярные выражения. и заменить подчеркивание на «.» что означает любой отдельный символ. поэтому вход выглядит так:

words = ['hatch','catch','match','chat','mates'] 
pattern = '.atc.'

и код:

import re
def filter_words_list(words, pattern):
ret = []
for word in words:
    if(re.match(pattern,word)):ret.append(word)
return ret

Надежды, которые помогли

0 голосов
/ 11 ноября 2018

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

import re

words = ['hatch','catch','match','chat','mates']
pattern = re.compile('[^atc]atc[^atc]')

result = list(filter(pattern.fullmatch, words))
print(result)

выход

['hatch', 'match']

Шаблон '[^atc]atc[^atc]' соответствует всему, что не является a или t или c ([^atc]), за которым следует 'atc', и снова все, что не является a или t или c.

В качестве альтернативы вы можете написать свою собственную функцию сопоставления, которая будет работать с любым шаблоном:

from collections import Counter


def full_match(word, pattern='_atc_'):
    if len(pattern) != len(word):
        return False

    pattern_letter_counts = Counter(e for e in pattern if e != '_')  # count characters that are not wild card
    word_letter_counts = Counter(word) # count letters

    if any(count != word_letter_counts.get(ch, 0) for ch, count in pattern_letter_counts.items()):
        return False

    return all(p == w for p, w in zip(pattern, word) if p != '_')  # the word must match in all characters that are not wild card


words = ['hatch', 'catch', 'match', 'chat', 'mates']


result = list(filter(full_match, words))
print(result)

выход

['hatch', 'match']

Далее

  1. См. Документацию по встроенным функциям any и all .
  2. См. Документацию по Счетчик .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...