Python 函数将字符串转换为数字数据类型和四舍五入浮点值

Python 函数将字符串转换为数字数据类型和四舍五入浮点值,python,Python,我编写了一个将字符串转换为数字数据类型的函数。虽然它正在工作,但我对代码没有印象,需要清理它 def str_to_numeric(str_list): """ modify elements of list received from file to numeric data type. """ temp_list = [] for item in str_list: if

我编写了一个将字符串转换为数字数据类型的函数。虽然它正在工作,但我对代码没有印象,需要清理它

def str_to_numeric(str_list):
        """
        modify elements of list received from file to numeric data
        type.

        """
        temp_list = []
        for item in str_list:
            if type(item) == str:
                try:
                    temp_list.append(int(item))
                except:
                    temp_list.append(round(float(item), 1))
            elif type(item) == float:
                temp_list.append(round(float(item), 1))
            else:
                temp_list.append(item)

        str_list = temp_list
        return str_list

List1 = ['1.0005','1.56666', 1, '1.2333', '1']

List1 = str_to_numeric(List1)
Output: [1.0, 1.6, 1, 1.2, 1]
我正在获得预期的输出,但我需要一些更改:

  • 我不想使用temp_list,而是想在同一个列表上执行类似以下内容的计算: item=int(item)
  • 我希望在调用str_to_numeric(List1)而不是List1=str_to_numeric(List1)时更新列表
  • 可能吗

    >>> def str_to_numeric(str_list):
            """
            modify elements of list received from file to numeric data
            type.
    
            """
            for i,item in enumerate(_ for _ in str_list):
                if type(item) == str:
                    try:
                        str_list[i] = int(item)
                    except:
                        str_list[i]=round(float(item), 1)
                elif type(item) == float:
                    str_list[i] = round(float(item), 1)
                else:
                    str_list[i]=item
    >>> List1 = ['1.0005','1.56666', 1, '1.2333', '1']
    >>> str_to_numeric(List1)
    >>> List1
    [1.0, 1.6, 1, 1.2, 1]
    
    工作。请记住,如果将列表传递给函数,它将传递其引用,因此在函数中更改列表就是更改实际列表


    工作。请记住,如果您将列表传递到函数中,它将传递其引用,因此在函数中更改列表就是更改实际列表。我认为,在这种情况下,您可以通过将代码分解为更多逻辑部分来获益。你的核心任务是围绕着对各种可能是数字的事物执行特定的操作,因此将其放在自己的函数中是有意义的。你也可以自己使用它。此外,您的测试过于复杂;无需测试输入是否为字符串。考虑以下事项:

    def make_numeric(thing, precision=1):
        try:
            return int(thing)
        except ValueError:
            return round(float(thing), precision)
    
    
    def str_to_numeric(str_list):
        for i in range(len(str_list)):
            str_list[i] = make_numeric(str_list[i])
    
    
    >>> k = ['1.0005','1.56666', 1, '1.2333', '1']
    >>> str_to_numeric(k)
    >>> k
    [1.0, 1.6, 1, 1.2, 1]
    

    我认为在这种情况下,您可以通过将代码分解成更多的逻辑片段来获益。你的核心任务是围绕着对各种可能是数字的事物执行特定的操作,因此将其放在自己的函数中是有意义的。你也可以自己使用它。此外,您的测试过于复杂;无需测试输入是否为字符串。考虑以下事项:

    def make_numeric(thing, precision=1):
        try:
            return int(thing)
        except ValueError:
            return round(float(thing), precision)
    
    
    def str_to_numeric(str_list):
        for i in range(len(str_list)):
            str_list[i] = make_numeric(str_list[i])
    
    
    >>> k = ['1.0005','1.56666', 1, '1.2333', '1']
    >>> str_to_numeric(k)
    >>> k
    [1.0, 1.6, 1, 1.2, 1]
    

    有什么原因不能使用numpy吗??它看起来很简单:
    numpy.array(List1.astype('float')
    任何不能使用numpy的原因??它看起来很简单:
    numpy.array(List1.astype('float')
    为什么要测试项的类型是否为字符串?如果不能将其转换为float或int,这将自然成为一个错误。是的,但这是你展示一个更具python风格的答案的机会。OP一开始就寻求关于更干净代码的帮助。这个函数可以是长度的一半。你永远不知道他最初的代码是什么意思,也不知道这是否比他发布的更重要。谁知道呢,如果他的列表可能包含一些不是字符串、int或float的内容呢?如果其中一个列表项是另一个列表,那么他可以在else语句中处理它。不管怎么说,他有两个问题,我回答了,结果成功了。为什么要吹毛求疵呢?如果列表中有一个与数字无关的项目,它就不会成为一个数字列表。挑剔的人会问你的换档钥匙是否坏了;我只是想帮助你尽可能给出最好的答案。我从来没有说过它会,我也不希望它使用此代码,但它仍然会接受该项并将其作为任何内容放入列表中。说到可能的最佳答案,请尝试使用您的代码将列表作为项目之一传入。它会崩溃吗?为什么要测试项目的类型是否为字符串?如果不能将其转换为float或int,这将自然成为一个错误。是的,但这是你展示一个更具python风格的答案的机会。OP一开始就寻求关于更干净代码的帮助。这个函数可以是长度的一半。你永远不知道他最初的代码是什么意思,也不知道这是否比他发布的更重要。谁知道呢,如果他的列表可能包含一些不是字符串、int或float的内容呢?如果其中一个列表项是另一个列表,那么他可以在else语句中处理它。不管怎么说,他有两个问题,我回答了,结果成功了。为什么要吹毛求疵呢?如果列表中有一个与数字无关的项目,它就不会成为一个数字列表。挑剔的人会问你的换档钥匙是否坏了;我只是想帮助你尽可能给出最好的答案。我从来没有说过它会,我也不希望它使用此代码,但它仍然会接受该项并将其作为任何内容放入列表中。说到可能的最佳答案,请尝试使用您的代码将列表作为项目之一传入。它会崩溃吗?