> 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 -- http://mail.python.org/mailman/listinfo/python-list