比较不同列表中的项目

时间:2018-11-10 19:07:19

标签: python list

我有一个函数是hangman的一部分,它有两个输入

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 :(得分:1)

类似的事情可能起作用:

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以便遍历这些对)。它会忽略模式的字符是否为'_'

现在编写函数时,它不会考虑单词或模式的长度。

答案 1 :(得分:1)

如果您使用.而不是_来表示丢失的字符,那么您基本上就有了一个正则表达式,例如:

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...

答案 2 :(得分:0)

检查以下代码:

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_”,则将无法正常工作。如果您需要类似的内容,请修改您的问题。

答案 3 :(得分:0)

此代码将过滤以提供的模式开头且与该模式一样长的单词(包括“ _”字符):

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']