问题描述
我正在研究信用卡验证器。 那个球体对我来说是新的,所以请不要笑: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 个。
1楼
在迭代数组时删除不是最好的做法,并且主要会导致在迭代时跳过数组中的某些元素,因此这是一种更安全的方法
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
2楼
几个问题:
-
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