不确定为什么我的测试会一直失败

时间:2017-11-04 03:02:44

标签: python loops failing-tests

我迫切需要帮助,我现在已经编码了一段时间但是已经有一段时间陷入困境了。

我的功能必须检查给定的单词是否包含特殊字符,以及没有特殊字符的单词长度是否大于3。

特殊字符是:()1234567890!?_ @#$%^& *。,'

如果单词中没有特殊字符,则该函数必须返回True,且没有特殊字符的单词长度大于3。

然而,这里的一个例外是允许特殊字符位于单词的末尾。

我的想法是将初始单词和特殊字符转换为列表,然后检查最后一个字符是否“特殊”。 (如果我从最后删除所有特殊字符,我不再需要担心它们,因为它们无论如何都是允许的。) 然后再次检查该单词是否包含特殊字符,如果是,则>返回False。 如果它不包含特殊字符,则len(list)是> 3然后返回True,否则:返回False(由于len(list)是< = 3。)

查看我的代码,我无法理解为什么我的测试失败了。

def check_word(word: str) -> bool:
  symbols = "()1234567890!?_@#$%^&*.,'"
  symbols_list = list(symbols)
  word_list = list(word)
  while word_list[-1] in symbols_list:
    del word_list[-1]
  for char in word_list:
    if char in symbols_list:
        return False
    elif char not in symbols_list and len(word_list) > 3:
        return True
    else:
        return False

持续失败的测试是:

print(check_word("te1234et1234"))  # False (Mine returns True)
print(check_word("mar132gus"))  # False (Mine returns True)

其他一切似乎都是有序的:

print(check_word("jaanus123"))  # True

print(check_word("123sander"))  # False

print(check_word("123joonas123"))  # False

这些测试失败的原因是什么?我错过了什么?

// Edit2所以正如一位用户所指出的那样,我继续使用我的代码上的调试器,问题似乎是当我进入我的初始“for”循环时它只检查我的第一个字符list是一个特殊字符,如果整个列表中有一个特殊字符,那么是否有人可以引导我走上正确的轨道,如何让循环遍历整个列表以寻找特价?

3 个答案:

答案 0 :(得分:2)

您不需要将字符串转换为列表,字符串是可迭代的:

  • 首先迭代地确定没有结尾的字符串切片 符号。
  • 其次,检查单词的剩余部分是否超过3 字符。
  • 最后,如果这些剩余字符不是符号

def check_word(word: str) -> bool:
    symbols = "()1234567890!?_@#$%^&*.,'"

    end = len(word)
    while word[end-1] in symbols:
        end -= 1

    if len(word[:end]) < 3:
        return False

    for char in word[:end]:
        if char in symbols:
            return False
    return True


def tests():
    assert check_word("jaanus123") is True
    assert check_word("123sander") is False
    assert check_word("123joonas123") is False
    assert check_word("te1234et1234") is False
    assert check_word("mar132gus") is False

    print("***all tests pass***")

tests()

输出:

***all tests pass***

答案 1 :(得分:0)

试试这个

def check_word(word):
    symbols = list("()1234567890!?_@#$%^&*.,'")
    word_list = list(word)
    while word_list[-1] in symbols:
        word_list.pop()
    print word_list
    temp="".join(word_list)
    actuallength=0
    for i in temp:
        if i in symbols:
            return False
        else:
            actuallength+=1
    if (actuallength >3):
        return True
    else:
        return False

<强>输出

>>> check_word("jaanus123")
['j', 'a', 'a', 'n', 'u', 's']
True
>>> check_word("123sander")
['1', '2', '3', 's', 'a', 'n', 'd', 'e', 'r']
False
>>> check_word("123joonas123")
['1', '2', '3', 'j', 'o', 'o', 'n', 'a', 's']
False
>>> check_word("te1234et1234")
['t', 'e', '1', '2', '3', '4', 'e', 't']
False
>>> check_word("mar132gus")
['m', 'a', 'r', '1', '3', '2', 'g', 'u', 's']
False
>>> 

答案 2 :(得分:-1)

['m', 'a', 'r', '1', '3', '2', 'g', 'u', 's'] 中的第一个字符是m,它不在symbol_list中,整个列表长度为9,因此函数返回True。

所以问题在于这句话len(word_list) > 3,长度不是没有特殊字符的单词