Python: 从循环中创建两个列表并对两者求和
Python: Create two lists from loop and sum both
我正在做一个CS50的信用项目,我在信用卡验证方面遇到了一些问题。
这里是我创建的函数:
def main():
while True :
cardnumber = input("Please enter a credit card number: ")
if cardnumber.isdecimal() and int(cardnumber) > 0 :
break
count = len(cardnumber)
if count != 13 and count != 15 and count != 16:
print("INVALID")
else:
check(count, cardnumber)
def check(length, number):
lenght_max = 15
if length == 15 and int(number[0]) == 3 and (int(number[1]) == 4 or int(number[1]) == 7):
if validator(number):
print("AMEX")
elif length == 16 and int(number[0]) == 5 and int(number[1]) <= 5:
if validator(number):
print("MASTERCARD")
elif length == 16 or length == 13 and int(number[0]) == 4:
if validator(number):
print("VISA")
else:
print("INVALID")
return number
def validator(num):
sum = 0
while num > 0:
sum += num % 10
num = num // 10
return sum
odd = [int(num[i]) * 2 for i in range(1, len(num), 2)]
even = [int(num[i]) for i in range(0, len(num), 2)]
new_sum = sum(validator(x) for x in odd) + sum(even)
if(new_sum % 10 == 0):
return True
else:
print("INVALID")
main()
我找到了打印偶数和赔率的方法(也乘以时间 2),但现在我必须对 booth 求和并检查余数是否为 0
编写一个辅助函数来对您的数字求和。您需要广泛使用它。
def dig_sum(num):
sum = 0
while num > 0:
sum += num % 10
num = num // 10
return sum
num = '378282246310005' # your credit card number
odd = [int(num[i]) * 2 for i in range(1, len(num), 2)] # these two remain the same
even = [int(num[i]) for i in range(0, len(num), 2)]
new_sum = sum(dig_sum(x) for x in odd) + sum(even)
if(new_sum % 10 == 0):
print('Valid') #valid!
sum(dig_sum(x) for x in odd)
将获得您的 odd
列表中每个数字的数字总和,sum(...)
将找到结果总和。
输入:
'378282246310005'
输出:
Valid
您的函数的第一个问题是您没有将 even/odd 数字存储在某处:您每次构造一个包含一个元素的列表,然后打印该元素.
现在由于一个数字乘以两次,只能得到一个两位数,我们可以用:
def sum2(x):
return (2*x)//10 + (2*x)%10
您可以构造一个 list all 奇数索引处的数字:
odd = [int(number[i]) for i in range(1,length,2)]
偶数索引的数字相同:
even = [int(number[i]) for i in range(0,length,2)]
现在我们可以简单地使用sum(..)
内置函数来求和数字:
total = sum(sum2(oddi) for oddi in odd) + sum(even)
并检查它是否是 10 的倍数:
return total%10 == 0
或者把它们放在一起:
def validator(number, length):
odd = [int(number[i]) for i in range(1,length,2)]
even = [int(number[i]) for i in range(0,length,2)]
total = sum(sum2(oddi) for oddi in odd) + sum(even)
return total%10 == 0
或者我们可以使用下面的一行专家:
from itertools import zip_longest
def validator(number,length):
numbi = iter(numbi)
return sum(x+sum2(y) for x,y in zip_longest(numbi,numbi,fillvalue=0))%10 == 0
我正在做一个CS50的信用项目,我在信用卡验证方面遇到了一些问题。
这里是我创建的函数:
def main():
while True :
cardnumber = input("Please enter a credit card number: ")
if cardnumber.isdecimal() and int(cardnumber) > 0 :
break
count = len(cardnumber)
if count != 13 and count != 15 and count != 16:
print("INVALID")
else:
check(count, cardnumber)
def check(length, number):
lenght_max = 15
if length == 15 and int(number[0]) == 3 and (int(number[1]) == 4 or int(number[1]) == 7):
if validator(number):
print("AMEX")
elif length == 16 and int(number[0]) == 5 and int(number[1]) <= 5:
if validator(number):
print("MASTERCARD")
elif length == 16 or length == 13 and int(number[0]) == 4:
if validator(number):
print("VISA")
else:
print("INVALID")
return number
def validator(num):
sum = 0
while num > 0:
sum += num % 10
num = num // 10
return sum
odd = [int(num[i]) * 2 for i in range(1, len(num), 2)]
even = [int(num[i]) for i in range(0, len(num), 2)]
new_sum = sum(validator(x) for x in odd) + sum(even)
if(new_sum % 10 == 0):
return True
else:
print("INVALID")
main()
我找到了打印偶数和赔率的方法(也乘以时间 2),但现在我必须对 booth 求和并检查余数是否为 0
编写一个辅助函数来对您的数字求和。您需要广泛使用它。
def dig_sum(num):
sum = 0
while num > 0:
sum += num % 10
num = num // 10
return sum
num = '378282246310005' # your credit card number
odd = [int(num[i]) * 2 for i in range(1, len(num), 2)] # these two remain the same
even = [int(num[i]) for i in range(0, len(num), 2)]
new_sum = sum(dig_sum(x) for x in odd) + sum(even)
if(new_sum % 10 == 0):
print('Valid') #valid!
sum(dig_sum(x) for x in odd)
将获得您的 odd
列表中每个数字的数字总和,sum(...)
将找到结果总和。
输入:
'378282246310005'
输出:
Valid
您的函数的第一个问题是您没有将 even/odd 数字存储在某处:您每次构造一个包含一个元素的列表,然后打印该元素.
现在由于一个数字乘以两次,只能得到一个两位数,我们可以用:
def sum2(x):
return (2*x)//10 + (2*x)%10
您可以构造一个 list all 奇数索引处的数字:
odd = [int(number[i]) for i in range(1,length,2)]
偶数索引的数字相同:
even = [int(number[i]) for i in range(0,length,2)]
现在我们可以简单地使用sum(..)
内置函数来求和数字:
total = sum(sum2(oddi) for oddi in odd) + sum(even)
并检查它是否是 10 的倍数:
return total%10 == 0
或者把它们放在一起:
def validator(number, length):
odd = [int(number[i]) for i in range(1,length,2)]
even = [int(number[i]) for i in range(0,length,2)]
total = sum(sum2(oddi) for oddi in odd) + sum(even)
return total%10 == 0
或者我们可以使用下面的一行专家:
from itertools import zip_longest
def validator(number,length):
numbi = iter(numbi)
return sum(x+sum2(y) for x,y in zip_longest(numbi,numbi,fillvalue=0))%10 == 0