Thanks very much.

Is there a way to do that without the list comprehension? I'm building this as 
part of a class, and I will not have talked about list comprehensions up until 
that point.

Thanks,

Irv


> On May 20, 2018, at 2:35 PM, Daniel Foerster <pydsig...@gmail.com> wrote:
> 
> I think what you're looking for is this:
> 
> my_list = [x for x in my_list if not need_to_delete(x)]
> 
> On Sun, May 20, 2018, 16:28 Irv Kalb <i...@furrypants.com 
> <mailto:i...@furrypants.com>> wrote:
> I am building a game where I am keeping track of many objects in a list 
> (let's just call it "myList".  In every "frame" of my game I need to see if 
> any objects need to be removed from myList.
> 
> I know that this code:
> 
> for item in myList:
>     if needsToBeDeleted(item):
>          myList.remove(item)
> 
> does not work correctly because it affects the order of list while I am 
> iterating over it.  (Specifically, if there are two elements in a row that 
> should be removed, the first one is removed, but the second one is skipped 
> over.)
> 
> I have looked at many different solutions, and have found a number of 
> different approaches, but none them seem elegant.  Here are ones that work:
> 
> 1)  Build a list of indices in reverse order (  [n - 1, n -2, n - 3, ... 0] ) 
>      Iterate over this list 
>           if the element at that index needs to be deleted, 
>                 pop the element at this index
> 
>     (untested, but should work)
> 
>      indexList = list(range(0, n - 1))
>      indexList.reverse()
> 
>      for index in indexList:
>           if needsToBeDeleted(myList[index]):
>                 myList.pop(index)
> 
>     I believe this will work, but it looks very clunky.
> 
> 
> 2)  Create a tempList that starts off empty. 
>      Iterate through my original list. 
>         If an element does NOT need to be deleted, append it to the tempList. 
>  
>      Reassign the myList to the tempList
>      Set the tempList to None (or delete it)
> 
>      tempList = []
>      for item in myList:
>          if not needsToBeDeleted(item):
>              tempList.append(item)
>       myList = tempList
>       tempList = None
> 
>      Seems OK, but again, seems like kind of a kludge.
> 
> 3)  Iterate through a copy of the list:
> 
>      for item in myList[:]:
>          if needsToBeDeleted(item):
>              myList.remove(item)
> 
>       This does work, but I would guess it might be slow for long lists 
> (since it first has to duplicate a list, then when it wants to delete an 
> element, 'remove' must search through the list to find the matching element 
> before deleting it).  Also, it would be tricky to explain to students, 
> because I am iterating through a copy of a list, but deleting elements from 
> the original list.
> 
> 
> Does anyone have an easier, more clear, reusable approach?
> 
> If not, any thoughts on which of these three approach would be most efficient 
> and clear?  I don't have a favorite yet.
> 
> Thanks,
> 
> Irv
> 
> 

Reply via email to