根据字符串在python

时间:2017-11-24 12:49:06

标签: 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] . 

问题是整数值 - 我处理的文件中的大多数 - 也被转换为float,从而占用更多内存 - 更不用说其他问题了(我必须使用它们中的一些作为索引 - 因此它们需要在某些时候转换为int ..)

是否有一种有效的方法可以将字符串转换为只浮动的那些(我不能丢失任何精度)和整数所有其他的整数?

2 个答案:

答案 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]