Beginner : removing tuples from a list
Mike C. Fletcher
mcfletch at rogers.com
Sat Feb 8 15:25:31 EST 2003
Ways to get what you want:
>>> t =
[(1,'john','usa'),(2,'jim','uk',),(3,'jeanne','f'),(4,'jack','usa')]
>>> europe = ['uk','f']
>>> filter( lambda x, europe=europe: x[2] not in europe, t )
[(1, 'john', 'usa'), (4, 'jack', 'usa')]
>>> [ entry for entry in t if entry[2] not in europe ]
[(1, 'john', 'usa'), (4, 'jack', 'usa')]
>>> for i in xrange( len(t)-1, -1, -1):
... if t[i][2] in europe:
... del t[i]
...
>>> t
[(1, 'john', 'usa'), (4, 'jack', 'usa')]
>>>
The problem you're seeing is that you're mutating the list you're
iterating over so that the for-loop is winding up skipping indices.
Reverse iteration works, as would using a while loop and only
incrementing the index when you _don't_ delete the current item. The
filter and list-comprehension versions are actually different beasts,
they create entirely new lists, rather than changing the original.
HTH,
Mike
Fabrizio wrote:
>Hi,
>
>I have a list containing tuples ("records") :
>
>t = [(1,'john','usa'),(2,'jim','uk',),(3,'jeanne','f'),(4,'jack','usa')]
>
>I want to remove all the "european records". I tried the following, but it
>doesn't work :
>
>europe = ['uk','f']
>
>x = 0
>for z in t :
> if z[2] in europe :
> t.pop(x)
> x = x +1
>
>print t
>
>
>
>>>>[(1, 'john', 'usa'), (3, 'jeanne', 'f'), (4, 'jack', 'usa')]
>>>>
>>>>
>
>But Jeanne is still there...
>
>TIA for your help
>
>
>Fabrizio
>
>
>
>
>
>
--
_______________________________________
Mike C. Fletcher
Designer, VR Plumber, Coder
http://members.rogers.com/mcfletch/
More information about the Python-list
mailing list