Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中将输入字符串转换为浮点列表_Python - Fatal编程技术网

如何在python中将输入字符串转换为浮点列表

如何在python中将输入字符串转换为浮点列表,python,Python,我正在制作一个程序来检查信用卡是否有效。我编写了代码来检查卡片的编号是否通过了Luhn的算法,但我在开始时忽略了一个细节,即不能直接将字符串列表转换为浮点数。当我开始使用真实的卡号测试我的程序时,我才意识到这一点,并得到了一个ValueError。有没有解决这个问题的方法,而不必重新实现我的解决方案 def card(digits): digits = [int(i) for i in digits] digits = [float(x) for x in (digits)]

我正在制作一个程序来检查信用卡是否有效。我编写了代码来检查卡片的编号是否通过了Luhn的算法,但我在开始时忽略了一个细节,即不能直接将字符串列表转换为浮点数。当我开始使用真实的卡号测试我的程序时,我才意识到这一点,并得到了一个ValueError。有没有解决这个问题的方法,而不必重新实现我的解决方案

def card(digits):
    digits = [int(i) for i in digits]
    digits = [float(x) for x in (digits)]
    print(digits)

    #checks card length and checksum
    if len(digits) == 13:
        even_digits = [digits[-2] * 2, digits[-4] * 2, digits[-6] * 2, digits[-8] * 2, digits[-10] * 2, digits[-12] * 2]
        odd_digits = [digits[-1], digits[-3], digits[-5], digits[-7], digits[-9], digits[-11], digits[-13]]
        all_sum = sum(odd_digits) + sum(even_digits)

        if all_sum % 10 == 0:
            print("checksum passed")

            if digits[0] == 4:
                print("VISA")
        else:
            print("INVALID")

    elif len(digits) == 15:
        even_digits = [digits[-2] * 2, digits[-4] * 2, digits[-6] * 2, digits[-8] * 2, digits[-10] * 2, digits[-12] * 2, digits[-14] * 2]
        odd_digits = [digits[-1], digits[-3], digits[-5], digits[-7], digits[-9], digits[-11], digits[-13], digits[-15]]
        all_sum = sum(odd_digits) + sum(even_digits)

        if all_sum % 10 == 0:
            print("checksum passed")

            if digits[0] == 3 and digits[1] == 7 or 4 :
                print("AMEX")        
        else:
            print("INVALID")

    elif len(digits) == 16:
        even_digits = [digits[-2] * 2, digits[-4] * 2, digits[-6] * 2, digits[-8] * 2, digits[-10] * 2, digits[-12] * 2, digits[-14] * 2, digits[-16] * 2]
        odd_digits = [digits[-1], digits[-3], digits[-5], digits[-7], digits[-9], digits[-11], digits[-13], digits[-15]]
        all_sum = sum(odd_digits) + sum(even_digits)

        if all_sum % 10 == 0:
            print("checksum passed")

            if digits[0] == 4:
                print("VISA")

            elif digits[0] == 5 and digits[1] == 1 or 2 or 3 or 4 or 5:
                print("MASTERCARD")
        else:
            print("INVAlID")

    else:
        print("INVALID")



card(input("Number: "))

解决这类问题的惯用方法是尝试将事物转换为浮点数,只有在失败时才会做出反应。在这种情况下,它失败了,因此我们需要在列表中添加某种过滤器来忽略这些失败:

# helper method to check if an object can be casted to another type
# (e.g. calling the constructor you give it on the object you give it, and
# checking whether an error happens)
def is_castable(obj, T):
    try:
        T(obj)
        return True
    except ValueError:
        return False

# add a condition to the list comprehensions to ignore the item if it doesn't
# typecast properly
def card(digits):
    digits = [float(x) for x in digits if is_castable(x, float)]
    ...
不必首先强制转换为
int
,除非您要求元素向下舍入。通常
float()
将接受
int()
将接受的任何字符串

另外,请确保要逐个字符处理
数字。如果您想标记它(例如,用户输入一个空格分隔列表,如<代码> 2 5×8 < 13 /代码>),则可以考虑调用<代码> .SPLIT()/<代码>初始<代码>数字< /代码>对象.< /p>
不能直接将字符串列表转换为浮点数

我不知道您认为“字符串列表”是什么意思,但您可以根据字符串中的文本看起来是有效整数还是浮点数,将字符串转换为整数或浮点数。类似于
“3”
的字符串转换为整数
3
或浮点值
3.0
;像
“apple”
这样的字符串不会转换为任何数字,因为没有可转换的合理数值。在实际代码中也是如此:您不能转换
(单个空格)

因为
数字
以前是字符串,所以它会迭代字符串的每个字符。如果您想迭代每个单词,那么需要首先将其拆分为多个单词。如果您只是想跳过空白,那么您也需要显式地这样做

但是你要做的第一件事是思考这个问题。您的输入可能是什么样的?你到底想在列表中得到什么结果

您希望使用
int
,而不是
float
,因为在实现算法时要进行整数运算

当您收到一条错误消息,说明无法将某些内容转换为其他内容时,您需要思考问题。错误是因为您试图转换成什么?还是因为你想从中转化?要想弄明白这一点,第一步是检查您试图从中转换的内容,并查看它对您所做的工作是否有意义


代码中还有许多其他逻辑错误。例如,
如果数字[0]==3和数字[1]==7或4:
不符合您的要求。在这一点上,您最好先按照教程进行操作,总体上要更加小心,并且更多地思考问题,而不是试图从堆栈溢出中获得帮助。而且,一次编写更少的代码。一旦您知道解决问题的逻辑步骤是什么,请执行每一步,并在继续之前确保它首先起作用。在您的情况下,第一步是获取所需的数字列表。

我尝试了您的代码,如果我输入的卡号在数字组之间没有“-”或“”,则代码将运行。您也不需要转换为浮动

所以我假设您需要去掉输入的卡号中的“-”或“”字符。如果您巧妙地要求用户仅在组之间使用“-”,则:

digits = digits.replace('-', '')
digits = [int(i) for i in digits]
这将解决这个问题


顺便说一句-一旦我解决了这个问题,它仍然无法验证我的卡号是否有效,因此出现了其他问题。

多亏了绿斗篷人,我才能够解决这个问题。如果有人愿意尝试,下面是更新的解决方案

#检查对象是否可以强制转换为其他类型的辅助方法
#感谢绿斗篷小子

def是可浇铸材料(obj,T): 尝试: T(obj) 返回真值 除值错误外: 返回False

def卡(数字):
数字=[如果可浇铸(x,浮动),则数字中x的浮动(x)]


卡片(输入(“数字:”)`

为什么需要浮点数?当我使用int时,我得到一个ValueError:int()的无效文本,以10为基数:“”errorOK。这并不意味着你需要花车。您需要或不需要浮点的原因是因为您打算对结果值执行什么操作。出现该错误的原因是,您试图从一个只有空格的字符串中生成
int
。那不行。从该字符串生成浮点数也不起作用。这里的每个其他答案都无法理解您实际尝试执行的操作。问题是,当我输入卡号并尝试将其转换为浮点数列表时,我遇到了运行时错误。有人建议我使用一个helper方法来忽略这个错误,它就可以工作了。此外,您之前未能验证您的卡的原因是我犯了一个小错误,即我必须在将大于10的数字添加到其他数字之前添加该数字。
digits = digits.replace('-', '')
digits = [int(i) for i in digits]
#checks card length and performs checksum(Luhn's algoritm)
if len(digits) == 13:
    even_digits = [digits[-2] * 2, digits[-4] * 2, digits[-6] * 2, digits[-8] * 2, digits[-10] * 2, digits[-12] * 2] #multipies even digits of the card by 2
    #adds digits of a number greater than 10
    #this is necessary because the checksum requires to add each digit of the even digits
    for even_digit in even_digits:
        if even_digit >= 10:
            ind = even_digits.index(even_digit)
            first_digit = int(even_digit / 10)
            last_digit = even_digit % 10
            even_digits[ind] = float(first_digit + last_digit)

    odd_digits = [digits[-1], digits[-3], digits[-5], digits[-7], digits[-9], digits[-11], digits[-13]]
    all_sum = sum(odd_digits) + sum(even_digits)

    if all_sum % 10 == 0:
        #After passing the checksum if the first digit is 4 then it is a visa card
        if digits[0] == 4:
            print("VISA")            
    else:
        print("INVALID")


elif len(digits) == 15:
    even_digits = [digits[-2] * 2, digits[-4] * 2, digits[-6] * 2, digits[-8] * 2, digits[-10] * 2, digits[-12] * 2, digits[-14] * 2]
    #adds digits of a number greater than 10
    #this is necessary because the checksum requires to add each digit of the even digits
    for even_digit in even_digits:
        if even_digit >= 10:
            ind = even_digits.index(even_digit)
            first_digit = int(even_digit / 10)
            last_digit = even_digit % 10
            even_digits[ind] = float(first_digit + last_digit)        
    odd_digits = [digits[-1], digits[-3], digits[-5], digits[-7], digits[-9], digits[-11], digits[-13], digits[-15]]
    all_sum = sum(odd_digits) + sum(even_digits)

    if all_sum % 10 == 0:
        #After passing the checksum if the card starts with 34 or 37 then it is an amex card
        if digits[0] == 3 and digits[1] == 7 or 4 :
            print("AMEX")            
    else:
        print("INVALID")


elif len(digits) == 16:
    even_digits = [digits[-2] * 2, digits[-4] * 2, digits[-6] * 2, digits[-8] * 2, digits[-10] * 2, digits[-12] * 2, digits[-14] * 2, digits[-16] * 2]
    #adds digits of a number greater than 10
    #this is necessary because the checksum requires to add each digit of the even digits
    for even_digit in even_digits:
        if even_digit >= 10:
            ind = even_digits.index(even_digit)
            first_digit = int(even_digit / 10)
            last_digit = even_digit % 10
            even_digits[ind] = float(first_digit + last_digit)
    odd_digits = [digits[-1], digits[-3], digits[-5], digits[-7], digits[-9], digits[-11], digits[-13], digits[-15]]
    all_sum = sum(odd_digits) + sum(even_digits)

    if all_sum % 10 == 0:
        #After passing the checksum if the first digit is 4 then it is a visa card
        if digits[0] == 4:
            print("VISA")
        #After passing the checksum if card starts with 51-5 then it is a mastercard
        elif digits[0] == 5 and digits[1] == 1 or 2 or 3 or 4 or 5:
            print("MASTERCARD")        
    else:
        print("INVAlID")

else:
    print("INVALID")