Remove items from a list

Mel Wilson mwilson at the-wire.com
Wed Sep 8 14:08:29 CEST 2004


In article <mailman.3029.1094638477.5135.python-list at python.org>,
Egbert Bouwman <egbert.list at hccnet.nl> wrote:
>On Wed, Sep 08, 2004 at 03:59:26AM +0000, Stan Cook wrote:
>> I was trying to take a list of files in a directory and remove all but the ".dbf" files.  I used the following to try to remove the items, but they would not remove.  Any help would be greatly appreciated.
>>
>> x = 0
>> for each in _dbases:
>>     if each[-4:] <> ".dbf":
>>             del each            # also tried:   del _dbases[x]
>>     x = x + 1
>>
>> I must be doing something wrong, but it acts as though it is....
>>
>The answers you received don't tell you what you are doing wrong.
>If you replace 'del each' with 'print each' it works,
>so it seems that you can not delete elements of a list you are
>looping over. But I would like to know more about it as well.

   One use of `del` is to remove a name from a namespace,
and that's what it's doing here:  removing the name 'each'.

   A paraphrase of what's going on is:

        for i in xrange (len (_dbases)):
            each = _dbases[i]
            if each[-4:] <> ".dbf":
                del each

and we happily throw away the name 'each' without touching
the item in the list.

   The way to remove items from a list is (untested code):

        for i in xrange (len (a_list)-1, -1, -1):
            if i_want_to_remove (a_list[i]):
                del a_list[i]

Going through the list backwards means that deleting an item
doesn't change the index numbers of items we've yet to
process.  `del a_list[i]` removes from the list the
reference to the object that was the i'th item in the list
(under the hood, a Python list is implemented as an array of
references.)

   This is one reason list comprehensions became popular so
fast.

        Regards.        Mel.



More information about the Python-list mailing list