用另一个迭代列表中的每个元素替换列表中的每个元素

Replace each elements of a list by another iterating each one of them

我正在使用 luhn 算法检查信用卡号(Visa 或 MasterCard)。

我有两个列表:

  1. credit_card_number_checked = [random numbers generated] : luhn 算法校验的信用卡号
  2. check_numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

    当luhn算法告诉我:

    invalid credit card number

然后我想用第二个列表替换第一个列表的每个数字,直到我得到 有效数字 有点像从右到左的计时器。

示例:
输入:

credit_card_number_checked = ['5', '4', '4', '4', '6', '5', '1', '2', '8', '0', '9', '5', '8', '6
', '7', '0']
check_numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

输出:

5 4 4 4 6 5 1 2 8 0 9 5 8 6 7 0
5 4 4 4 6 5 1 2 8 0 9 5 8 6 7 1
5 4 4 4 6 5 1 2 8 0 9 5 8 6 7 2
5 4 4 4 6 5 1 2 8 0 9 5 8 6 7 3...

5 4 4 4 6 5 1 2 8 0 9 5 8 6 1 0
5 4 4 4 6 5 1 2 8 0 9 5 8 6 2 0
5 4 4 4 6 5 1 2 8 0 9 5 8 6 3 0...

5 4 4 4 6 5 1 2 8 0 9 5 8 1 7 0
5 4 4 4 6 5 1 2 8 0 9 5 8 2 7 0
5 4 4 4 6 5 1 2 8 0 9 5 8 3 7 0...

不清楚为什么要在此处混合使用字符串和它,但选择一致可能会更好。

就是说...您可以制作一个生成器,它会按以下顺序生成迭代:

def makeIters(cc, n):
    for i in range(len(cc) - 1, -1, -1):
        yield from (cc[:i] + [str(num)] + cc[i+1:] for num in n)

有了它,您可以懒惰地遍历数字,直到找到一个通过测试的数字:

cc = ['5', '4', '4', '4', '6', '5', '1', '2', '8', '0', '9', '5', '8', '6', '7', '0']
n = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

for cc in  makeIters(cc, n): 
    if luhn(cc):  # your luhn test that returns true with a good number
        print(cc)
        break

您可以使用相同的生成器通过 filter():

获取所有好号码的列表
list(filter(luhn, makeIters(cc, n)))