您好我是一个孤立的爱好开发者。 我的知识有限。 这是一次我试过109次的运动(我的耻辱) 我觉得一些帮助会教会我很多。 这是运动: 定义一个函数postalValidate(S),它首先检查S是否代表有效的邮政编码:
这是众多试验中的一个:
def postalValidate(S):
for x in S:
if x == " ":
S = S.remove(x)
if x.isalpha():
x = x.upper()
if x.isalpha() or ix.isdigit():
if ((S.index(x) % 2 == 0) and x.isalpha()) or ((S.index(x) % 2 != 0) and x.isdigit()):
pass
else:
print(False)
break
return(False)
else:
print(False)
break
return(False)
elif x.isdigit:
pass
else:
print(False)
break
return(False)
elif x.isalpha():
if S.index(x) % 2:
pass
else:
break
return(False)
elif x.isdigit():
if S.index(x) % 2 == 1:
pass
else:
break
return(False)
else:
break
return(False)
pass
print(S)
return(S)
我的错误的原因是什么。这是我错过的一些基础知识。 欢迎所有教学答案!
答案 0 :(得分:1)
我可以告诉你,简单地将字符串拆分成数组会更有效率,然后只检查每个字符的类型。你可以使用单个for循环来完成它,并且只需要一个模数条件来确定它是否在奇数或偶数索引中。您也可以简单地使用6个if语句。
总的来说,它看起来像 拆分字符串 因为(我少于6) 检查是偶数还是奇数。 如果是偶数字母,请检查此索引是否为char 如果是奇数 - ,请检查此索引是否为数字如果有帮助,请告诉我。
答案 1 :(得分:1)
迈克的建议:正则表达式很好;不幸的是,我的答案中存在一些问题,这些问题没有作为评论格式化:
我可以建议:
vals = re.findall(r'([a-zA-Z]\d)', string) # this returns an array of all the pairs of letter + number.
if len(vals) != 3: # if there aren't exactly 3 pairs, this isn't valid
return false
return "".join([v[0].upper+v[1] for v in vals] #uppercase the letter, and combine the 3 pairs as a string
答案 2 :(得分:1)
你的程序比它需要的更复杂。
您已经列出了要执行的步骤,让我们将它们转换为Python代码:
def postalValidate(S):
# first, delete all spaces
S = ''.join(S.split())
# the remainder must be of the form L#L#L# where L are letters (in either lower or upper case) and # are numbers.
# If S is not a valid postal code, return the boolean False.
if len(S) != 6:
return False
if not (all(S[i].isalpha() for i in [0, 2, 4]) and
all(S[i].isdigit() for i in [1, 3, 5])):
return False
# If S is valid, return a version of the same postal code in the nice format L#L#L# where each L is capital.
return S.upper()
有很多方法可以用更少的代码做同样的事情,但我想保持简单。
编辑:使用方法从此question的答案中显示的字符串中删除所有空格。
答案 3 :(得分:0)
import string
# Create translation table:
# convert lowercase to uppercase, and remove spaces
TRANS = str.maketrans(string.ascii_lowercase, string.ascii_uppercase, " ")
# char identity tests
TESTS = [str.isalpha, str.isdigit] * 3
def postal_validate(s):
# clean string
s = s.translate(TRANS)
# test whether it is a valid postal code
if len(s) == 6 and all(test(ch) for ch,test in zip(s, TESTS)):
# if so, return it
return s
else:
# otherwise return False
return False
答案 4 :(得分:0)
"""this is my code:"""
def simplifier(S):
S = str(S)
x = " "
S = S.replace(x, "")
return(S)
def majusculiser(S):
S = str(S)
for x in S:
if str(x).isalpha():
S = (S.replace(x, x.upper()))
return(S)
def purifier(S):
S = str(S)
for x in S:
if (not x.isdigit()) and (not x.isalpha()):
return(False)
else:
return(S)
def verifier_les_impairs(S):
S = str(S)
l = len(S)
for x in range (0, l, 2):
if not str(x).isalpha:
return(False)
else:
return(S)
def verifier_les_pairs(S):
S = str(S)
l = len(S)
for x in range (1, l, 2):
if not str(S[x]).isdigit():
return(False)
else:
return(S)
def postalValidate(S):
S = simplifier(S)
if True:
S = purifier(S)
S = majusculiser(S)
if (len(S) + 1) % 2 == 0:
return(False)
if True:
S = verifier_les_impairs(S)
if True:
S = verifier_les_pairs(S)
if True:
return(S)
else:
return(False)
else:
return(False)
else:
return(False)
print(postalValidate('n2l 3g1z'),
postalValidate('postal'),
postalValidate('H0H0H0H0'),
postalValidate(' e3g 7k 0 l5G 6'),
postalValidate('5/ B?7t8'))
Very length but very easy.