당신은 당신을 위해이 작업을 수행하는 사용자 정의 remove
방법을 구축 할 수 있습니다 :
def remove(self, id):
for index, item in enumerate(self):
if item.id == id:
break
else:
raise ValueError("id not found")
del self[index]
데모 :
>>> class Orders(list):
... def __init__(self, *args):
... super(Orders, self).__init__()
... self.extend(args)
... def add(self, id, value):
... self.append(Order(id, value))
... def remove(self, id):
... for index, item in enumerate(self):
... if item.id == id:
... break
... else:
... raise ValueError("id not found")
... del self[index]
...
>>> order = Orders()
>>> order.add(1, 'alpha')
>>> order.add(2, 'beta')
>>> order.add(3, 'lambda')
>>> order.add(4, 'omega')
>>> order
[Order(id=1, value='alpha'), Order(id=2, value='beta'), Order(id=3, value='lambda'), Order(id=4, value='omega')]
>>> order.remove(2)
>>> order
[Order(id=1, value='alpha'), Order(id=3, value='lambda'), Order(id=4, value='omega')]
>>> order.remove(5) # Nonexistent id
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 12, in remove
ValueError: id not found
>>>
이 함수는 보통 list.remove
처럼 데이터를 한 번만 전달한다는 점에 유의하십시오.
이 솔루션의 주된 이점은 단순성입니다. 클래스 정의의 다른 부분을 변경하지 않고 remove
메소드를 구현할 수 있습니다. 즉, 그것은 여전히 O(n)
복잡성에서 실행됩니다. 성능이 주요 관심사라면 @MartijnPieters가 제안한 O(1)
id-lookup 접근 방식을 구현하는 시간을 가져야합니다.
이들은 상대적으로 작은 목록 일 것이므로이 경우 성능은 주요 관심사가 아닙니다. –