用另一个迭代列表中的每个元素替换列表中的每个元素
Replace each elements of a list by another iterating each one of them
我正在使用 luhn 算法检查信用卡号(Visa 或 MasterCard)。
我有两个列表:
credit_card_number_checked = [random numbers generated]
: luhn 算法校验的信用卡号
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)))
我正在使用 luhn 算法检查信用卡号(Visa 或 MasterCard)。
我有两个列表:
credit_card_number_checked = [random numbers generated]
: luhn 算法校验的信用卡号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)))