将字符串值转换为float并从列表中删除字符串

时间:2016-04-13 09:03:37

标签: python list

我有一个看起来像这样的列表

lst = ['a','b','43.23','c','9','22']

我想删除无法表示为浮点数的元素,因此我正在执行以下操作(尝试1):

for i,j in enumerate(lst):
    try:
        lst[i]=float(j)
    except:
        lst.remove(j)

这使得列表看起来像这样

lst = ['b', 43.23, '9', 22.0]

而我需要的是这个

lst = [43.23, 9.0 , 22.0]

所以我正在做以下事情:

for i,j in enumerate(lst):
    try:
        lst[i]=float(j)
    except:
        pass
lst = [i for i in lst if type(i) != str]

有更清洁的方法吗?

编辑:根据以下建议将示例列表的名称从“列表”更改为“lst”。

5 个答案:

答案 0 :(得分:2)

您可以使用此stackoverflow post中的以下功能:

def isfloat(value):
  try:
    float(value)
    return True
  except ValueError:
    return False

然后,在列表理解中使用它:

>>> l = ['a','b','43.23','c','9','22']
>>> [float(x) for x in l if isfloat(x)]
# [43.23, 9.0, 22.0]

答案 1 :(得分:1)

首先,您不应该为变量命名list它会影响内置的list 函数/类。您可以使用一个简单的函数来执行此操作:

>>> lst = ['a','b','43.23','c','9','22']
>>> def is_float(el):
...     try:
...         return float(el)
...     except ValueError:
...         pass
... 
>>> [i for i in lst if is_float(i)]
['43.23', '9', '22']
>>> [float(i) for i in lst if is_float(i)] # to return a list of floating point number
[43.23, 9.0, 22.0]

您的代码存在的问题是您在迭代时尝试修改list。相反,您可以复制列表,然后使用元素索引删除它们的值。

lst = ['a','b','43.23','c','9','22']
lst_copy = lst.copy()
for el in lst:
    try:
        float(val)
    except ValueError:
        lst_copy.remove(el)

当然,这比使用带有谓词的列表理解的解决方案效率低,因为您首先需要复制原始列表。

答案 2 :(得分:0)

你不应该操纵你要迭代的列表(你也不应该调用它list,因为你会影响内置的list)因为那与指数混淆了。

'b'出现在输出中的原因是,在第一次迭代中,'a'不是浮点数,因此它会被删除。因此,您的列表将成为:

['b','43.23','c','9','22']

b变为list[0]。但是,下一次迭代会调用list[1]跳过'b'

要避免此类问题,您可以定义第二个列表并将合适的值附加到:

l1 = ['a','b','43.23','c','9','22']
l2 = []

for item in l1:
    try:
        l2.append(float(item))
    except ValueError:  # bare exception statements are bad practice too!
        pass

答案 3 :(得分:0)

考虑使用有效使用系统内存的迭代器会更好。以下是我对解决方案的看法。

def func(x):
    try:
        return float(x)
   except ValueError:
        pass

filter(lambda x: x, map(func, li))

答案 4 :(得分:0)

从这篇文章中借用想法:python: restarting a loop,可以通过简单的while循环修复第一次尝试

lst = ['a','b','43.23','c','9','22']
temp = 0
while temp<len(lst):
      try:
         lst[temp] = float(lst[temp])
         temp+=1
      except ValueError:
         lst.remove(lst[temp])
         temp = 0

让我得到了期望的结果(通过重置循环迭代器)

lst = [43.23, 9.0 , 22.0]