![](/img/trans.png)
[英]Iterate through a string forwards and backwards, extracting alternating characters
[英]How to iterate backwards through a string using “for in range”? (application is to validate UPC codes)
我正在尝试创建一个程序,该程序根据用户输入的一串数字来检查任何长度的 UPC 代码(尽管大多数是 12 位)的有效性。 我目前的方法是首先将字符串存储到列表中,然后使用“for in range”遍历列表。
我用于 UPC 代码验证算法如何工作的指南如下:(UPC 代码的设计方式部分是为了防止收银员在结账时打错字,因为一个错误的数字可能会使代码无效)
验证过程从右到左运行。
对于偶数位置的数字,没有变化。
对于奇数位置的数字,将数字乘以 3。
总结结果。
对于有效的 UPC 编号,此总和将是 10 的倍数。
除了准则 1 之外,我已经能够按照我希望的那样运行所有东西,即验证过程从右到左跨越 UPC 代码中的数字字符串。 我目前的方法是从左到右。 如果用户输入的 UPC 代码是奇数位数,这将被证明是一个问题,因为它会抛出算法。
def upc_check(code):
中的输入code
:下面是用户输入的UPC码,查看UPC码是否有效。
def upc_check(code):
ODD_DIGIT_MULTIPLIER = 3
UPC_VALIDITY_DIVISOR = 10
digits = []
for num in code:
digits.append(int(num))
print(digits)
check_sum = 0
for i in range(0, len(code)):
if (i + 1) % 2 != 0:
check_sum += (ODD_DIGIT_MULTIPLIER * digits[i])
else:
check_sum += (digits[i])
if check_sum % UPC_VALIDITY_DIVISOR == 0:
return "Valid UPC code."
else:
return "Invalid UPC code."
目前,output 符合我的预期(即有效的 UPC 代码显示为有效,无效的 UPC 代码显示为无效),但算法是从左到右通过数字字符串。
从右到左到 go,我希望我可以进行以下替换并达到相同的结果:
for i in range(0, len(code)):
和
for i in range(-1, -len(code), -1):
这将使代码如下所示:
def upc_check(code):
ODD_DIGIT_MULTIPLIER = 3
UPC_VALIDITY_DIVISOR = 10
digits = []
for num in code:
digits.append(int(num))
print(digits)
check_sum = 0
for i in range(-1, -len(code), -1):
if (i + 1) % 2 != 0:
check_sum += (ODD_DIGIT_MULTIPLIER * digits[i])
else:
check_sum += (digits[i])
if check_sum % UPC_VALIDITY_DIVISOR == 0:
return "Valid UPC code."
else:
return "Invalid UPC code."
但是,当我进行此更改时,我所有有效的 UPC 代码现在都返回无效值,我不确定为什么。 我希望 output 是一样的。 有没有人有什么建议? 感谢您的任何帮助!
如果对检查有帮助,以下是有效的 UPC 代码:
096619363148
017082886026
381370036005
以下是一些无效的 UPC 代码(上述代码中的故意拼写错误):
096619363149
017082786026
381370036015
你在这里需要的有点复杂。 默认情况下,范围不是 go 的完整方式。
for i in range(len(code)-1,-1,-1):
等会工作,但不会让我觉得很neet。 我不知道其他方法,也许其他人知道?
如果代码从左到右按照您的预期工作,那么保持大部分代码不变的快速方法是在 for 循环之前反转您的数字列表。
所以digits = digits.reverse()
和你的 for 循环的第一行可以保持原样
for i in range(0, len(code)):
我会对此进行测试并很快更新我的答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.