Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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中字符串的性质将其转换为浮点或整数_Python_String_List_Integer - Fatal编程技术网

根据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]