python - 创建检查代码是否有效的函数时的小问题
问题描述
我正在尝试解决一个要求检查代码是否有效的 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
参数:
code_letters
是对代码字符串的第一个字母有效的代码字母列表min_for_each_letter
是一个列表,其中包含该字母后面每个数字的最小可能数字(包括)max_for_each_letter
是一个列表,其中包含该字母后面每个数字的最大可能数字(包括)
例如,如果代码包含“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() 不考虑空格
解决方案
在提供的最后一个示例'P '
(失败)中,if
嵌套在for
循环中的语句将检查除P
. code[1:]
在这种情况下将是" "
(两个空格),因此if
条件评估为False
,因此不会根据代码标准检查任何内容。
(此外,在函数的最后一行,总是not False
会计算为,因此语句本身是多余的;反而会更好。)True
if
return 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
推荐阅读
- spring - 休息时使用 post 或 delete 的哪个 crud 操作?
- r - Tidyverse unnest_tokens 在函数内部不起作用
- c - 如何更改文件的扩展名
- angular - TypeError:无法读取未定义的属性“indexOf”和无法读取未定义的属性“toLowerCase”
- c# - 在 IIS 上托管时使用 Google Vision OCR API 时出现问题
- ajax - 为什么表格不显示?
- python - 如何在python中将vtk转换为stl?
- python - 将两个文件合并为一个而不读取其内容
- apache-spark - 根据数据作业的大小启动 kubernetes pod 内存
- lua - 在while循环期间的ComputerCraft Catch函数