首页 > 解决方案 > 创建检查代码是否有效的函数时的小问题

问题描述

我正在尝试解决一个要求检查代码是否有效的 rev 问题。如果代码由code_letters列表中的 1 个字母和一定范围内的数字组成,则代码有效。

code_letters = ["S", "B", "N", "T", "P"]
min_for_each_letter = [1, 3, 4, 0, 3] #inclusive
max_for_each_letter = [7, 9, 6, 7, 5] #inclusive

参数:

例如,如果代码包含“S”,则其数字只能介于 1 和 7(含)之间,或者如果代码包含“N”,则其数字只能介于 4 和 6(含)之间。
必须只有1个字母和至少1个数字,如果有多个数字,它们都必须在字母范围内才有效,否则无效

到目前为止,这是我编写的代码:

def is_a_valid_code(code):
    code_letters = ["S", "B", "N", "T", "P"]
    min_for_each_letter = [1, 3, 4, 0, 3] #inclusive
    max_for_each_letter = [7, 9, 6, 7, 5] #inclusive
      
    if code[0] not in code_letters:
        return False
    else:
        x = code_letters.index(code[0])
    
    for ele in code[1:]:
        if ele != " ":
            if ele.isdigit() == False or int(ele) < min_for_each_letter[x] or int(ele) > max_for_each_letter[x]:
                return False
                    
    if not False:
        return True

它适用于测试用例,例如:

is_a_valid_code('B747346')
is_a_valid_codeN('N  444  454')
is_a_valid_codeT('T 400 4854')
is_a_valid_codeS('S  444S454')

但对于以下情况失败:

is_a_valid_code('P  ') # Should return False, not True

有没有办法解决这种情况?我认为有一个简单的修复,但 .isalpha() 不考虑空格

标签: python

解决方案


在提供的最后一个示例'P '(失败)中,if嵌套在for循环中的语句将检查除P. code[1:]在这种情况下将是" "(两个空格),因此if条件评估为False,因此不会根据代码标准检查任何内容。

(此外,在函数的最后一行,总是not False会计算为,因此语句本身是多余的;反而会更好。)Trueifreturn True

我认为最好的方法是创建一个列表code[1:]其中包含第一个字符True'P ')。


def is_valid(code):
    code_letters = ["S", "B", "N", "T", "P"]
    letter_minimum = [1, 3, 4, 0, 3]
    letter_maximum = [7, 9, 6, 7, 5]
    if code[0] not in code_letters:
        return False
    index = code_letters.index(code[0])
    num_range = (letter_minimum[index], letter_maximum[index])
    validity = []
    for i in code[1:]:
        if i == " ":
            continue
        try:
            i = int(i)
            if not (num_range[0] <= i <= num_range[1]):
                validity.append(False)
        except ValueError:
            validity.append(False)
        validity.append(True)
    return bool(all(validity) and validity)

使用提供的示例代码,一些测试运行:

>>> is_valid('B747346')
True
>>> is_valid('N  444  454')
True
>>> is_valid('T 400 4854')    # Fails because 8 is out of the range [0, 7].
False
>>> is_valid('S  444S454')    # Fails because 'S' is not a number
False
>>> is_valid('P  ')    # Fails because no numbers exist
False

推荐阅读