我有一个看起来像这样的列表
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”。
答案 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]