0

我迫切需要帮助,我现在已经编写了一点代码,但已经被问题困住了一段时间。

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

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

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

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

我的想法是将初始单词和特殊字符变成一个列表,然后检查最后一个字符是否为“特殊”。(如果我从末尾删除所有特殊字符,我就不必再担心它们了,因为无论如何它们都是允许的。)然后再次检查该单词是否包含特殊字符,如果确实 > 返回 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”循环时,它只检查我列表中的第一个字符是否是特殊字符,如果整个列表中有特殊字符,则没有人可以引导我找到正确的方法,让循环遍历整个列表以查找特价商品?

4

3 回答 3

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***
于 2017-11-04T03:24:53.003 回答
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
>>> 
于 2017-11-04T03:40:53.963 回答
-1

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

所以问题出在这个语句len(word_list) > 3中,长度与没有特殊字符的单词无关

于 2017-11-04T03:28:25.590 回答