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