0

I have created a list of instances (with a for loop). When I try to delete single instances from this list I get an error saying they aren't in the list. I have made a simple example showing my problem:

class example ():
    list = []

    def __init__ (self, name):
        example.list.append(self)
        self.name = name

for i in range(5):
    name = ("example_" + str(i+1))
    name = example(name)

to_delete = []

to_delete.append(example.list[2])
to_delete.append(example.list[0])
to_delete.append(example.list[4])

for j in to_delete:
    example.list.remove(to_delete)

print(example.list)

The objects to delete are in the list. At least, when I print them out:

List of instances:
[<__main__.example object at 0x7fdc77082c50>, <__main__.example object at 0x7fdc77082be0>, <__main__.example object at 0x7fdc77082c88>, <__main__.example object at 0x7fdc77082b00>, <__main__.example object at 0x7fdc77082b38>]

Objects to remove:
[<__main__.example object at 0x7fdc77082c88>, <__main__.example object at 0x7fdc77082c50>, <__main__.example object at 0x7fdc77082b38>]

Why is this behaving oddly?

SuperBiasedMan
  • 9,814
  • 10
  • 45
  • 73
Christoph Müller
  • 483
  • 1
  • 5
  • 16

2 Answers2

4

You are trying to remove the whole list to_delete from the list, not each item individually. As the object to_delete itself is not in the list (though each item it contains is), it will throw an error.

This:

for j in to_delete:
    example.list.remove(to_delete) #try to remove object to_delete

Should be:

for j in to_delete:
    example.list.remove(j) #try to remove each object IN to_delete

Additionally, you could simply use list comprehension to do this:

example.list = [x for x in example.list if x not in to_delete]
Community
  • 1
  • 1
River
  • 8,585
  • 14
  • 54
  • 67
0

Why not use this simple way of remove your to_delete sublist from the example.list

map(example.list.remove, to_delete)

Palmer
  • 493
  • 4
  • 13