On 5/11/2010 11:29 AM, Jerry Hill wrote:
On Tue, May 11, 2010 at 11:08 AM, Ulrich Eckhardt
<eckha...@satorlaser.com>  wrote:
My first approach was to simply postpone removing the elements, but I was
wondering if there was a more elegant solution.

Iterate over something other than the actual dictionary, like this:

d = {1: 'one', 2: 'two', 3: 'three'}

for k in d.keys():
     if d[k] == 'two':
         d.pop(k)

This, as written, does not work in 3.1, where d.keys is a view of the dict. Nor does

for k in filter(lambda k: d[k] == 'two', d):
        d.pop(k)

But these do

for k in list(filter(lambda k: d[k] == 'two', d)):
        d.pop(k)

for k in [k for k in d if d[k] == 'two']:
        d.pop(k)

Rather than make an external list of *all* keys, one only needs to make a list of keys to be removed, which often will be much smaller.

Terry Jan Reedy

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to