# A list containing zero elements

I have a list containing zero and nonzero elements. How can I throw away zero elements and just keep non zero ones.

-
Cases[{0, f, y, e, 1, 2, 3}, Except[0]] – Rorschach Feb 26 '14 at 15:46
DeleteCases[list,0] – Coolwater Feb 26 '14 at 16:12
Instead of either of the two suggestions above, I recommend Select[list, # != 0 &] for the reason that pattern matching differentiates between 0. and 0 while == has a small tolerance even for machine precision zeros. Pattern matching can be fixed by using 0|0. in place of 0. – Szabolcs Feb 26 '14 at 16:16

Use

Select[list, # != 0 &]


for the simplest solution.

A non-obvious solution that can be quite fast (for versions $\ge 8$), especially for packed arrays, is

Pick[list, Unitize[list], 1]


This'll give you better performance than Select.

A warning about pattern matching: it differentiates between exact 0 and inexact 0., thus

In[2]:= DeleteCases[{0., 0, 1}, 0]
Out[2]= {0., 1}

In[3]:= DeleteCases[{0., 0, 1}, 0.]
Out[3]= {0, 1}


You can use the pattern 0|0. but using comparison (== or !=) is both clearer and == allows for greater differences from zero (that might arise due to numerical roundoff errors during calculations) than === and pattern matching. So I recommend ==. (You might google for Internal$EqualTolerance and Internal$SameQTolerance if you wish to learn about these tolerances.)

-