【问题标题】:compare items from different lists比较不同列表中的项目
【发布时间】:2018-11-10 19:07:19
【问题描述】:

我有一个作为 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']

谢谢!

【问题讨论】:

  • 你用什么输入?看起来返回的第一行只有 1 个错误,即第一个 aaron。其他匹配ABA序列
  • @Austin 仅显示长度相同的单词
  • @Austin 是的......其中一个似乎不正确 - 带有len 检查的代码意味着它不应该在那里...... :)
  • 嘿 sry 那里有一个小错误,编辑它。无论如何 - 后面和后面的节目,但两次。我也得到了 aaron(不应该在那里)

标签: python list


【解决方案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 来遍历这些对)。如果模式的字符是'_',它会忽略。

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

【讨论】:

  • 美丽。 OP 的关键见解是认识到 python 中的字符串是可迭代的,因此可以在 zip 中使用。
【解决方案2】:

如果您使用. 而不是_ 作为您丢失的字符,那么您基本上得到了一个正则表达式,例如:

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

【讨论】:

  • ...这也是我的首选!
【解决方案3】:

检查以下代码:

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_”,它就不起作用。如果您需要类似的内容,请编辑您的问题。

【讨论】:

  • 你能解释一下startswitch部分和拍拍吗?谢谢
  • 基本上,我正在做的是从模式“ab___”中获取 ab。现在我们在 python 中有一个名为“startswith”的方法,它检查字符串是否以特定字符串开头。所以在这种情况下,它会检查一个单词是否以“ab”开头。查看startswith文档:programiz.com/python-programming/methods/string/startswith
  • 哦,所以它不适用于字符串不在开头的模式?
【解决方案4】:

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

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

【讨论】:

  • 你能解释一下split部分和startswitch吗?
  • 我在这里使用 split 来删除带有“_”字符的部分并具有纯模式,以便稍后检查单词是否以它开头。
  • 如果我不仅想要它开始,而且只有它,我该怎么办?例如:catch fetch hat, tache pattern is _tc 所以输出会是 catch fetch and hat (withuot tache)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-20
相关资源
最近更新 更多