首页 > 解决方案 > 数组中的一个多余元素总是留下

问题描述

我正在研究信用卡验证器。那个球体对我来说是新的,所以请不要笑: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。

标签: pythonarrayselement

解决方案


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

    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

推荐阅读