Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.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中混合数据类型对象中的数字转换为int/float,同时保持静止不变_Python_Python 3.x - Fatal编程技术网

将python中混合数据类型对象中的数字转换为int/float,同时保持静止不变

将python中混合数据类型对象中的数字转换为int/float,同时保持静止不变,python,python-3.x,Python,Python 3.x,我的清单如下: input_a= [['a','12','','23.5'],[12.3,'b2','-23.4',-32],[-25.4,'c']] 我想把这里的数字转换成数字,得到这样的输出 output_a = [['a',12,'',23.5],[12.3,'b2',-23.4,-32],[-25.4,'c']] 我编写了以下代码来实现此功能: def str_to_num(str_object=None): if not isinstance(s

我的清单如下:

    input_a= [['a','12','','23.5'],[12.3,'b2','-23.4',-32],[-25.4,'c']]
我想把这里的数字转换成数字,得到这样的输出

    output_a = [['a',12,'',23.5],[12.3,'b2',-23.4,-32],[-25.4,'c']]
我编写了以下代码来实现此功能:

    def str_to_num(str_object=None):
      if not isinstance(str_object,str):
        return str_object
      try:
        x = int(str_object)
      except ValueError:
        try:
           x = float(str_object)
        except ValueError:
           x =str_object
      return x

    def getNumbers(num_object=None,return_container=None):
      a = return_container
      if isinstance(num_object,list):
        b = []
        for list_element in num_object:
           if isinstance(list_element,list):
              x = getNumbers(list_element,a)
           if isinstance(list_element,str):
              y = str_to_num(list_element)
              b += [y]
           if isinstance(list_element,int):
              y = list_element
              b += [y]
           if isinstance(list_element,float):
              y = list_element
              b += [y]
        a += [b]
      return return_container

    return_container = []
    output_a = getNumbers(input_a,return_container)[:-1]
(在这种情况下)这是有效的。但我有两个问题: 1.如果列表有另一个嵌套级别,它就不会工作得很好。我想使它能够处理任何级别的嵌套。 所以如果

这给

    output_b= [[-15],['a',12,'',23.5],[12.3,'b2',-23.4,-32],[-25.4,'c']]
这是错误的,[-15]应该嵌套在第一个子列表中

  • 代码非常冗长!!我相信一定有更简单的方法来处理这个问题

  • 你遵循传统,只是试图改变信仰

    input_b= [['a','12','','23.5',['15']],[12.3,'b2','-23.4',-32],[-25.4,'c']]
    
    def parseEm(l):
        """Parses a list of mixed strings, strings of floats, strings of ints, ints and floats.
        Returns int where possible, float where possible else string as list elements."""
        def tryParse(elem):
            def asInt(e):
                """Tries to convert to int, else returns None"""
                try:
                    return int(e)
                except:
                    return None
            def asFloat(e):
                """Tries to convert to float, else returns None"""
                try:
                    return float(e)
                except:
                    return None        
            # if elem itself is a list, use list comp to get down it's elements
            if isinstance(elem,list):
                return [tryParse(q) for q in elem]
    
            # try to convert to int, else to float or return original value
            if isinstance(elem,str):
                a,b = asInt(elem),asFloat(elem)
                if a is not None:
                    return a
                elif b is not None:
                    return b
    
            return elem
    
            # this does not work, as interger 0 is considered false: 
            # return asInt(elem) or asFloat(elem) or elem
    
        # apply tryParse to all elements of the input list
        return [tryParse(k) for k in l]
    
    print(parseEm(input_b))
    
    输出:

    [['a', 12, '', 23.5, [15]], [12, 'b2', -23.4, -32], [-25, 'c']]
    

    不过要小心,有些东西可能会转换为您可能(不)想要的浮点值-f.e.
    [“NaN”]
    是一个包含1个浮点值的有效列表。

    这很可爱!!我检查了更多的嵌套,它的工作。有一个问题。使用负浮点数时,它将其转换为int。例如,最后一个子列表中的-25.4被转换为-25。@AlhpaDelta我将代码更改为仅通过isFloat和isInt解析字符串-现在应该可以工作。但在某种情况下,它会失败。如果一个数字有逗号。像‘1222’。我们怎样才能避免这种情况?你不知道。它不是python数字的有效整数或浮点表示形式。它是一种人类可读的格式,使用数千个分隔符字符,这取决于您所处的文化。对我来说,它的
    用于分隔千和
    ,“
    用于部分:
    '1.234.567,89€`”。如果您确定只会得到
    ,`作为千分位数,您可以将
    asFloat(e)
    更改为使用
    返回float(e.replace(“,”,”)
    [['a', 12, '', 23.5, [15]], [12, 'b2', -23.4, -32], [-25, 'c']]