Один лишний элемент в массиве всегда остается - PullRequest
0 голосов
/ 21 марта 2020

Я работаю над валидатором кредитных карт. Эта сфера для меня новая, так что, пожалуйста, не смейтесь: D Я пытаюсь закончить ее без 1027 * * без каких-либо библиотек.

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')

Так что проблема в массиве четных . Возвращает

[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 нет.

Ответы [ 2 ]

0 голосов
/ 21 марта 2020

Пара проблем:

  • Python имеет нулевые индексированные массивы, поэтому evens[::2] фактически возвращает первый, третий и т. Д. c. ди git. Аль go Луна требует, чтобы четные цифры (при условии 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
0 голосов
/ 21 марта 2020

Удаление во время итерации по массиву - не лучшая вещь, и в большинстве случаев это приведет к пропуску некоторых элементов в массиве во время итерации, поэтому более безопасный способ сделать это

    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
...