当前位置: 代码迷 >> python >> 数组中总是留下一个多余的元素
  详细解决方案

数组中总是留下一个多余的元素

热度:76   发布时间:2023-07-16 10:45:21.0

我正在研究信用卡验证器。 那个球体对我来说是新的,所以请不要笑:D 我正在尝试在没有任何库的情况下完成它。

def creditCardValidation(creditcard):
    creditcard = creditcard.replace( ' ', '' )
    creditcard = [int(i) for i in creditcard]
    evens = creditcard[::2]
    odds = creditcard[1::2]
    evens = [element * 2 for element in evens]

    for j in evens:
        if j >= 10:
            j = [int(d) for d in str(j)]
            for x in j:
                evens.append(x)

    for j in evens:
       if j >= 10:        
            evens.remove(j)
    return ((sum(evens) + sum(odds)) % 10 == 0)

creditCardValidation('1234 5678 9101 1213')

creditCardValidation('4561 2612 1234 5464')

creditCardValidation('4561 2612 1234 5467')

所以问题出在数组evens 中 它返回

[2, 6, 14, 0, 2, 2, 1, 0, 1, 4, 1, 8]

[8, 4, 2, 2, 6, 12, 1, 2, 1, 0, 1, 2]

[8, 4, 2, 2, 6, 12, 1, 2, 1, 0, 1, 2]

除了大于 10 的结果外,它应该返回相同的结果。一切正常。 看看第一个数组,删除了 18 个,删除了 10 个,但没有删除 14 个。

在迭代数组时删除不是最好的做法,并且主要会导致在迭代时跳过数组中的某些元素,因此这是一种更安全的方法

    for j in evens:
       if j >= 10:        
            evens.remove(j)

是收集您想在另一个列表中删除的所有元素,然后如果您使用numpy arrrays或一个一个删除它们,则从原始列表中减去它,因为 python 列表没有定义减法操作来从另一个数组中减去一个数组

to_remove = []
for j in evens:
  if j >= 10:        
    to_remove.append(j)
for j in to_remove:
  events.remove(j)

或者你可以白名单而不是黑名单

small_evens = []
for j in evens:
  if j < 10:        
    small_evens.append(j)
# use small_evens and discard evens array

几个问题:

  • Python 有零索引数组,因此evens[::2]实际上返回第一个、第三个等数字。 Luhn 的算法需要将偶数位(假设有 1 个索引)加倍。
  • 您不应该修改正在迭代的列表。

您可以简化,删除很多列表创建:

def creditCardValidation(creditcard):
    *creditcard, checkdigit = creditcard.replace(' ', '')

    total = 0
    for i, digit in enumerate(map(int, creditcard), 1):
        if i % 2 == 0:
            digit *= 2
            total += digit // 10   # Will be zero for single digits
        total += digit % 10

    return 9*total % 10 == int(checkdigit)

In []:
creditCardValidation('1234 5678 9101 1213')

Out[]:
True

In []:
creditCardValidation('4561 2612 1234 5464')

Out[]:
False
  相关解决方案