Steven D'Aprano wrote:
On Fri, 12 Dec 2008 19:02:24 -0500, Terry Reedy wrote:
...
Tim Chase wrote:
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] = []
Contrast that with the alternative suggested by Tim:

def deNone2(alist):
    alist[:] = [x for x in alist if x is not None]
 ...
Here's another low-level algorithm, the classical delete items in place algorithm. Three lines, one index, lousy O(N**2) performance.

def deNone3(alist):
    for i in xrange(len(alist)-1, -1, -1):
        if alist[i] is None:
            del alist[i]

Now, let's do a shoot-out. Do they return the same thing?
   ... [good measurements generally reinforcing Tim's implementation] ...

If you want to keep the original's method, but do it in a more Pythonic
way, I would suggest:

    def deNone4(alist):
        j = 0
        for val in alist:
            if val is not None:
                alist[j] = val
                j += 1
        del alist[j :]

This still loses to Tim's clearer code, but by nowhere near as much.

--Scott David Daniels
scott.dani...@acm.org
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to