Removing None objects from a sequence

Tim Chase python.list at tim.thechases.com
Fri Dec 12 23:32:08 CET 2008


> If you want to literally remove None objects from a list....(or mutable 
> sequence)
> 
> def deNone(alist):
>    n=len(alist)
>    i=j=0
>    while i < n:
>      if alist[i] is not None:
>        alist[j] = alist[i]
>        j += 1
>      i += 1
>    alist[j:i] = []
> 
> blist=[None,1,None,2,None,3,None,None,4,None]
> deNone(blist)
> print(blist)
> 
> # prints [1, 2, 3, 4]

...wouldn't a cleaner way of doing this just be

   >>> blist=[None,1,None,2,None,3,None,None,4,None]
   >>> alist = blist
   >>> blist[:] = [x for x in blist if x is not None]
   >>> blist
   [1, 2, 3, 4]
   >>> alist
   [1, 2, 3, 4]

By using the slice assignment, it leaves the blist referring to 
the same list-object (as shown by the "alist" bit), and modifying 
it in place.  This reads a lot more cleanly in my estimation.

If the data-set is large, in 2.5+, you can just use a generator:

   blist[:] = (x for x in blist if x is not None)

-tkc






More information about the Python-list mailing list