将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']]