2011-03-26 54 views
2

我有一个列表如下:删除空元素,但保持零作为值

lst = [-1.33, '', -1.33, -1.33 -2.62, 0, -2.66, 1.41, 0, 0, 1.40, '', 1.37, 0] 

那里有两个空的元素列表''几个零和浮点数。

如何删除空的元素,但保持零?如下...

lst2 = [-1.33, -1.33, -1.33 -2.62, 0, -2.66, 1.41, 0, 0, 1.40, 1.37, 0] 

我曾尝试以下:

lst2 = filter(None, lst) 

lst2 = [x for x in lst if x if isinstance(x,str) == False] 

但是,它消除了零为好。

我知道浮动返回12位小数,请忽略例如的目的。

有什么建议吗? 谢谢。

+0

大家好,忘了补充一点,空字符串可能有几个空格。即'''','''','''''。 – siva 2011-03-26 14:38:03

+0

为了解决空间问题,只需做x.strip()!='' – 2011-03-26 14:42:25

回答

9

为什么不简单地删除所有''

>>> lst2 = [x for x in lst if x != ''] 
>>> lst2 
[-1.33, -1.33, -3.95, 0, -2.66, 1.41, 0, 0, 1.4, 1.37, 0] 
>>> 

,或者你可以只保留花车和整数:

>>> [x for x in lst if isinstance(x, (float, int))] 
[-1.33, -1.33, -3.95, 0, -2.66, 1.41, 0, 0, 1.4, 1.37, 0] 

# or a bit fancier 
>>> import numbers 
>>> [x for x in lst if isinstance(x, numbers.Number)] 
[-1.33, -1.33, -3.95, 0, -2.66, 1.41, 0, 0, 1.4, 1.37, 0] 
+0

这肯定会起作用。刚想自己回答。 – seadowg 2011-03-26 14:33:47

+0

太棒了!谢谢.. – siva 2011-03-26 14:46:15

2
>>> l = [x for x in lst if x != ''] 
>>> l 
[-1.3300000000000001, -1.3300000000000001, -3.9500000000000002, 0, -2.6600000000000001, 1.4099999999999999, 0, 0, 1.3999999999999999, 1.3700000000000001, 0] 

似乎没问题。

1

我觉得过滤功能是美丽的方式做你想做的。

lst = [-1.33, '', -1.33, -1.33 -2.62, 0, -2.66, 1.41, 0, 0, 1.40, '', 1.37, 0] 
lst2 = filter(lambda x: x != '', lst) 
print lst2 

输出继电器:

[-1.33, -1.33, -3.95, 0, -2.66, 1.41, 0, 0, 1.37, 1.37, 0] 

正如你可以阅读here

filter(function, iterable) 

等于

[item for item in iterable if function(item)] 
+0

谢谢。很有帮助。 – siva 2011-03-26 14:46:55

3

让我们来看看你有什么

lst2 = [x for x in lst 
if x 
if isinstance(x,str) == False] 

你有什么在那里if x呢?

而且,永远永远永远使用== False== True

使用not isinstance(x, str)

所以,你应该有

lst2 = [x for x in lst if isinstance(x, str)] 

或者其他建议

lst2 = [x for x in lst if x != ''] 

由于您的任务列表字符串和数字rs里面,我怀疑在创建这个列表的时候处理这​​个会更容易。当然,没有看到我不能确定或告诉你如何解决它。

+0

argh ..'如果x'是一个错字。比剪切和粘贴写得好。现在工作!谢谢。 – siva 2011-03-26 14:45:39