Ratko wrote:
On Jul 17, 9:57 am, mk <[EMAIL PROTECTED]> wrote:
Gary Herron wrote:
You could remove the object from the list with
del myList[i]
if you knew i. HOWEVER, don't do that while looping through the list!
Changing a list's length will interact badly with the for loop's
indexing through the list, causing the loop to mis the element following
the deleted item.
Jumping into a thread, I know how not to do it, but not how to do it
properly?
Iterating over a copy may _probably_ work:
>>> t=['a', 'c', 'b', 'd']
>>>
>>> for el in t[:]:
del t[t.index(el)]
>>> t
[]
However, is it really safe? Defining safe as "works reliably in every
corner case for every indexable data type"?
Con: suppose the data structure t is really, really big. Just deleting
some items from t temporarily doubles the memory consumption.
Would this work (safely) then? It does in my test cases but that of
course doesn't prove it works in a general case...
for item in myList:
myList.remove(item)
No. Same problem, The for loop iterates through the list by keeping
and incrementing an internal index. Any modification of the list does
not change the index correspondingly.
One proper way:
newList = []
for item in myList:
if ... whatever...
newList.append(item)
myList = newList
Another, using list comprehension (it's the same thing really as the above):
myList = [item for item in myList if ... whatever...]
For dictionaries we can just iterate over values() or items() as
opposed to itervalues() or iteritems() since that's technically a copy
of values or items in the dict, right?
No! In fact the whole point of iteritems and itervalues and iterkeys is
that they *DO NOT* make copies, so changing the dictionary out from
under them is a programming error.
If you use dict.items(), dict.keys() or dict.values(), then you're OK,
because these methods *do* create new lists for both.
Gary Herron
R
--
http://mail.python.org/mailman/listinfo/python-list
--
http://mail.python.org/mailman/listinfo/python-list