繁体   English   中英

如何使用“for in range”向后迭代字符串? (应用程序是验证UPC代码)

[英]How to iterate backwards through a string using “for in range”? (application is to validate UPC codes)

我正在尝试创建一个程序,该程序根据用户输入的一串数字来检查任何长度的 UPC 代码(尽管大多数是 12 位)的有效性。 我目前的方法是首先将字符串存储到列表中,然后使用“for in range”遍历列表。

我用于 UPC 代码验证算法如何工作的指南如下:(UPC 代码的设计方式部分是为了防止收银员在结账时打错字,因为一个错误的数字可能会使代码无效)

  1. 验证过程从右到左运行。

  2. 对于偶数位置的数字,没有变化。

  3. 对于奇数位置的数字,将数字乘以 3。

  4. 总结结果。

  5. 对于有效的 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM