解析文件后,我获得了一个包含数值的字符串列表,让我们说:
my_list = ['1', '-2.356', '00.57', '0', '-1', '02678', '0.005367', '0', '1']
为了获得这些数值,我做了以下几点:
new_list = [float(i) for i in my_list] .
问题是整数值 - 我处理的文件中的大多数 - 也被转换为float,从而占用更多内存 - 更不用说其他问题了(我必须使用它们中的一些作为索引 - 因此它们需要在某些时候转换为int ..)
是否有一种有效的方法可以将字符串转换为只浮动的那些(我不能丢失任何精度)和整数所有其他的整数?
答案 0 :(得分:4)
如果可能的话,您可以构建一个将字符串转换为整数的函数,否则浮动(如果失败,则将它们保留为字符串)。
my_list = ['1', '-2.356', '00.57', '0', '-1', '02678', '0.005367', '0', '1']
def converter(n):
try:
return int(n)
except ValueError:
try:
return float(n)
except ValueError:
return n # <- left as string
print([converter(x) for x in my_list]) # -> [1, -2.356, 0.57, 0, -1, 2678, 0.005367, 0, 1]
这是有效的,因为int('2.3')
与int(2.3)
不同。第一个返回错误,第二个剪辑浮动并返回2
。
另请注意,排列try
块的顺序非常重要,因为float('2')
可以正常工作。因此,必须首先尝试转换为int
!
答案 1 :(得分:2)
列表中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]
[1,
1000.0,
-inf,
inf,
nan,
nan,
-2.356,
0.57,
0,
-1,
2678,
0.005367,
0,
1,
398472398472943657410843104729572471308172374018301478744723974523987452938729847194719841471476574572394710481048075434810482398752481038185739847239847294365741084310472957247130817237401830147874472397452398745293872984719471984147147657457239471048104807543481048239875248103818573984723984729436574108431047295724713081723740183014787447239745239874529387298471947198414714765745723947104810480754348104823987524810381857398472398472943657410843104729572471308172374018301478744723974523987452938729847194719841471476574572394710481048075434810482398752481038185739847239847294365741084310472957247130817237401830147874472397452398745293872984719471984147147657457239471048104807543481048239875248103818573984723984729436574108431047295724713081723740183014787447239745239874529387298471947198414714765745723947104810480754348104823987524810381857398472398472943657410843104729572471308172374018301478744723974523987452938729847194719841471476574572394710481048075434810482398752481038185739847239847294365741084310472957247130817237401830147874472397452398745293872984719471984147147657457239471048104807543481048239875248103818573984723984729436574108431047295724713081723740183014787447239745239874529387298471947198414714765745723947104810480754348104823987524810381857398472398472943657410843104729572471308172374018301478744723974523987452938729847194719841471476574572394710481048075434810482398752481038185739847239847294365741084310472957247130817237401830147874472397452398745293872984719471984147147657457239471048104807543481048239875248103818573984723984729436574108431047295724713081723740183014787447239745239874529387298471947198414714765745723947104810480754348104823987524810381857]