сравнить элементы из разных списков - PullRequest
0 голосов
/ 10 ноября 2018

У меня есть функция, которая является частью палача, которая получает два ввода

filter_words_list(words, pattern):

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

Вот что я попробовал:

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[j] and i == j:
                        relevant_words.append(word)
print(relevant_words)

filter_words_list(['aardvark', 'aardwolf', 'aaron', 'aback', 'abacus', 
'abaft', 'abalone'],'ab___',))

печать: не хорошо .. как вы можете видеть здесь:

['aaron', 'aback', 'aback', 'abaft', 'abaft']

печать мне нужна:

['aback', 'abaft']

спасибо!

Ответы [ 4 ]

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

Если вы используете . вместо _ для пропавшего персонажа, то вы в основном получаете регулярное выражение, например:

import re

words = ['aardvark', 'aardwolf', 'aaron', 'aback', 'abacus', 'abaft', 'abalone']
# starting with ab followed by exactly 3 characters ($ means match end of string)
wanted = [word for word in words if re.match('ab...$')]
#  ['aback', 'abaft']
# starting with ab followed by at least 3 characters (notice no $ here)
wanted2 = [word for word in words if re.match('ab...', word)]
# ['aback', 'abacus', 'abaft', 'abalone']
# starting with ab, followed by any letter, followed by "f", and exactly one letter
wanted3 = [word for word in words if re.match('ab.f.$', word)]
# ['abaft']
# etc...
0 голосов
/ 10 ноября 2018

что-то вроде этого может работать:

words = ('aardvark', 'aardwolf', 'aaron', 'aback', 'abacus',
'abaft', 'abalone')

pattern = 'ab___'

def match(word, pattern):

    # also need to match the length?
    # if len(word) != len(pattern):
    #     return False

    for letter, p in zip(word, pattern):
        if p == '_':
            continue
        if letter != p:
            return False
    return True

matches = [word for word in words if match(word, pattern)]
print(matches)

сравнивает одну букву слова с одним символом шаблона (используя zip для итерации по этим парам). игнорируется, если символ шаблона '_'.

так как функция написана сейчас, она не учитывает длину ни слова, ни шаблона.

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

Этот код будет фильтровать слова, которые начинаются с предоставленного шаблона и имеют длину до этого шаблона (включая символы "_"):

def filter_words_list(words, pattern):
    pattern_len = len(pattern)
    pattern = pattern.split('_')[0]

    relevant_words = []
    for word in words:
        if len(word) == pattern_len and word.startswith(pattern):
            relevant_words.append(word)

    return relevant_words

words = ['aardvark', 'aardwolf', 'aaron', 'aback', 'abacus', 'abaft', 'abalone']
pattern = 'ab___'
print(filter_words_list(words, pattern)) # ['aback', 'abaft']
0 голосов
/ 10 ноября 2018

Проверьте следующий код:

def filter_words_list(words, pattern):
    relevant_words = []
    pat = pattern.replace("_","")
    for word in words:
        if word.startswith(pat):
            relevant_words.append(word)
    print(relevant_words)

filter_words_list(['aardvark', 'aardwolf', 'aaron', 'aback', 'abacus','abaft', 'abalone'],'ab___',)

Вывод:

['aback', 'abacus', 'abaft', 'abalone']

Примечание: он сработает только в том случае, если задан шаблон, например, он начинается с определенных символов.Например, это не сработает в случае, если шаблон "__a_".Пожалуйста, измените свой вопрос, если вам нужно что-то подобное.

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