根据python中字符串的性质将其转换为浮点或整数
解析文件后,我获得了一个包含数值的字符串列表,比如:根据python中字符串的性质将其转换为浮点或整数,python,string,list,integer,Python,String,List,Integer,解析文件后,我获得了一个包含数值的字符串列表,比如: my_list = ['1', '-2.356', '00.57', '0', '-1', '02678', '0.005367', '0', '1'] 为了获得这些数值,我执行以下操作: new_list = [float(i) for i in my_list] . 问题是,在我处理的文件中占多数的整数值也被转换为浮点值,从而占用更多内存,更不用说其他问题了(我必须将其中一些用作索引,因此需要在某个点将它们转换为int…) 是否有一
my_list = ['1', '-2.356', '00.57', '0', '-1', '02678', '0.005367', '0', '1']
为了获得这些数值,我执行以下操作:
new_list = [float(i) for i in my_list] .
问题是,在我处理的文件中占多数的整数值也被转换为浮点值,从而占用更多内存,更不用说其他问题了(我必须将其中一些用作索引,因此需要在某个点将它们转换为int…)
是否有一种有效的方法可以仅将需要的字符串转换为浮点值(我不能失去任何精度)并将所有其他字符串转换为整数?如果可能,您可以构建一个函数,将字符串转换为整数,否则将其转换为浮点值(如果失败,则将其保留为字符串)
my_list=['1'、'-2.356'、'00.57'、'0'、'-1'、'02678'、'0.005367'、'0'、'1']
def转换器(n):
尝试:
返回整数(n)
除值错误外:
尝试:
返回浮动(n)
除值错误外:
返回n#[1,-2.356,0.57,0,-1,2678,0.005367,0,1]
这是因为int('2.3')
与int(2.3)
不同。第一个返回错误,而第二个剪辑浮点并返回2
还请注意,
try
块的排列顺序非常重要,因为float('2')
确实有效。因此,必须首先尝试转换为int
列表中int和float的区别在于是否存在
,您可以使用它来选择要使用的类型
new_list = [float(elt) if '.' in elt else int(elt) for elt in my_list]
编辑:
为了处理浮点特殊情况,@EvKounis提出的转换器函数是一个好主意;@PM2Ring备注后对其进行扩展:
my_list = ['1', '1E3', '-inf', 'inf', 'NaN', 'nan', '-2.356', '00.57', '0', '-1', '02678', '0.005367', '0', '1', '398472398472943657410843104729572471308172374018301478744723974523987452938729847194719841471476574572394710481048075434810482398752481038185739847239847294365741084310472957247130817237401830147874472397452398745293872984719471984147147657457239471048104807543481048239875248103818573984723984729436574108431047295724713081723740183014787447239745239874529387298471947198414714765745723947104810480754348104823987524810381857398472398472943657410843104729572471308172374018301478744723974523987452938729847194719841471476574572394710481048075434810482398752481038185739847239847294365741084310472957247130817237401830147874472397452398745293872984719471984147147657457239471048104807543481048239875248103818573984723984729436574108431047295724713081723740183014787447239745239874529387298471947198414714765745723947104810480754348104823987524810381857398472398472943657410843104729572471308172374018301478744723974523987452938729847194719841471476574572394710481048075434810482398752481038185739847239847294365741084310472957247130817237401830147874472397452398745293872984719471984147147657457239471048104807543481048239875248103818573984723984729436574108431047295724713081723740183014787447239745239874529387298471947198414714765745723947104810480754348104823987524810381857398472398472943657410843104729572471308172374018301478744723974523987452938729847194719841471476574572394710481048075434810482398752481038185739847239847294365741084310472957247130817237401830147874472397452398745293872984719471984147147657457239471048104807543481048239875248103818573984723984729436574108431047295724713081723740183014787447239745239874529387298471947198414714765745723947104810480754348104823987524810381857']
def convert_to_int_or_float(elt):
try:
e = float(elt)
except ValueError:
raise ValueError
elt = elt.lower()
if '.' in elt or 'e' in elt or 'inf' in elt or 'nan' in elt:
pass
else:
e = int(elt)
return e
[convert_to_int_or_float(e) for e in my_list]
输出:
您可以查看字符串是否包含一个
。
,使用它来决定是要浮点(i)
还是int(i)
。那么可以精确表示为int的浮点值呢,比如1.0
?另请参见+one
,因为您也处理字符串(如果int
和float
失败),我本打算以重复的方式结束这个问题,但我找不到一个好的目标来优先考虑这项技术,我同意这是最好的方法,除非你能保证所有的字符串都是简单的,即没有像“12E3”或“Nan”这样的字符串。首先,你要看到它不是微不足道的,并提出一个好的方法。让我们希望OP的数据不包含没有小数点的科学记法中的浮点,例如“12E3”。现在它处理Nan
,-inf
,inf
,和科学记数法,感谢您提出了更高的要求。现在,值大于浮点最大值的整数也得到了正确处理。Ev。Kounis的技术可以处理所有“有趣”的浮动,而不需要特定的测试。但无论如何,你可以简化一下这些测试。例如:elt=elt.lower()。当我用any(语句)替换逐案测试时,代码会因非常大的int而中断:它返回float('inf')
。我不知道为什么,但我已经在我的屏幕前太久了,现在还看不到它。
my_list = ['1', '1E3', '-inf', 'inf', 'NaN', 'nan', '-2.356', '00.57', '0', '-1', '02678', '0.005367', '0', '1', '398472398472943657410843104729572471308172374018301478744723974523987452938729847194719841471476574572394710481048075434810482398752481038185739847239847294365741084310472957247130817237401830147874472397452398745293872984719471984147147657457239471048104807543481048239875248103818573984723984729436574108431047295724713081723740183014787447239745239874529387298471947198414714765745723947104810480754348104823987524810381857398472398472943657410843104729572471308172374018301478744723974523987452938729847194719841471476574572394710481048075434810482398752481038185739847239847294365741084310472957247130817237401830147874472397452398745293872984719471984147147657457239471048104807543481048239875248103818573984723984729436574108431047295724713081723740183014787447239745239874529387298471947198414714765745723947104810480754348104823987524810381857398472398472943657410843104729572471308172374018301478744723974523987452938729847194719841471476574572394710481048075434810482398752481038185739847239847294365741084310472957247130817237401830147874472397452398745293872984719471984147147657457239471048104807543481048239875248103818573984723984729436574108431047295724713081723740183014787447239745239874529387298471947198414714765745723947104810480754348104823987524810381857398472398472943657410843104729572471308172374018301478744723974523987452938729847194719841471476574572394710481048075434810482398752481038185739847239847294365741084310472957247130817237401830147874472397452398745293872984719471984147147657457239471048104807543481048239875248103818573984723984729436574108431047295724713081723740183014787447239745239874529387298471947198414714765745723947104810480754348104823987524810381857']
def convert_to_int_or_float(elt):
try:
e = float(elt)
except ValueError:
raise ValueError
elt = elt.lower()
if '.' in elt or 'e' in elt or 'inf' in elt or 'nan' in elt:
pass
else:
e = int(elt)
return e
[convert_to_int_or_float(e) for e in my_list]
[1,
1000.0,
-inf,
inf,
nan,
nan,
-2.356,
0.57,
0,
-1,
2678,
0.005367,
0,
1,
398472398472943657410843104729572471308172374018301478744723974523987452938729847194719841471476574572394710481048075434810482398752481038185739847239847294365741084310472957247130817237401830147874472397452398745293872984719471984147147657457239471048104807543481048239875248103818573984723984729436574108431047295724713081723740183014787447239745239874529387298471947198414714765745723947104810480754348104823987524810381857398472398472943657410843104729572471308172374018301478744723974523987452938729847194719841471476574572394710481048075434810482398752481038185739847239847294365741084310472957247130817237401830147874472397452398745293872984719471984147147657457239471048104807543481048239875248103818573984723984729436574108431047295724713081723740183014787447239745239874529387298471947198414714765745723947104810480754348104823987524810381857398472398472943657410843104729572471308172374018301478744723974523987452938729847194719841471476574572394710481048075434810482398752481038185739847239847294365741084310472957247130817237401830147874472397452398745293872984719471984147147657457239471048104807543481048239875248103818573984723984729436574108431047295724713081723740183014787447239745239874529387298471947198414714765745723947104810480754348104823987524810381857398472398472943657410843104729572471308172374018301478744723974523987452938729847194719841471476574572394710481048075434810482398752481038185739847239847294365741084310472957247130817237401830147874472397452398745293872984719471984147147657457239471048104807543481048239875248103818573984723984729436574108431047295724713081723740183014787447239745239874529387298471947198414714765745723947104810480754348104823987524810381857]