簡體   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