a bug in list.remove?
Tim Chase
python.list at tim.thechases.com
Fri Aug 18 15:00:16 EDT 2006
> I have 2 lists. What Im doing is check the first list and remove all
> occurances of the elements in the second list from the first list, like so:
> >>> ps = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
> >>> qs = [6,7,8,9,10,11,12,1,2]
> >>> for p in ps:
> if p in qs:
> ps.remove(p)
>
> The problem Im having is that when I do
> >>> print ps
> it gives me
> [2, 3, 4, 5, 7, 9, 11, 13, 14, 15]
> which is incorrect since 2,7,9,11 shouldnt be in that list. Is this a
> bug in .remove? or is my algorithm somewhat flawed?
I'd go with the "somewhat flawed" answer.
I'd just use
ps = [x for x in ps if x not in qs]
which will remove *all* instances of x from ps if it exists in
qs. There's a subtle difference from the remove() method, which
will only remove the first instance:
>>> help([].remove)
Help on built-in function remove:
remove(...)
L.remove(value) -- remove first occurrence of value
If qs is large, you'll get improved performance by converting it
to a set first:
>>> s = set(qs)
>>> ps = [x for x in ps if x not in s]
As for your algorithm, you're modifying the list over which
you're iterating--at best, often considered bad form...at worst,
I've had Python throw exceptions at me for attempting it.
-tkc
More information about the Python-list
mailing list