2015-01-17 2 views
1

list를 확장하고 orderedtuple들 추가 다음 클래스를 고려 우리는 남았습니다 ...제거 namedtuple

print order 
[Order(id=1, value='alpha'), Order(id=2, value='beta'), Order(id=3, value='lambda'), Order(id=4, value='omega')] 

내가 임의의 요소를 제거하려는 경우 id. 예 :

order.remove(id=2) # ideal function call to remove by `id` 
print order 
[Order(id=1, value='alpha'), Order(id=3, value='lambda'), Order(id=4, value='omega')] 

이 작업을 수행하는 방법은 비교적 간단합니까?

답변

3

당신은 그것을 느린 방법으로 수행 할 수 있습니다 당신은 특정 인덱스에지도 ID 및/또는 값을 추적 클래스에 인덱스를 추가 할 수

def remove(self, id=None, value=None): 
    for elem in self: 
     if (id is not None and elem.id == id or 
       value is not None and elem.value == value): 
      super(Orders, self).remove(elem) 
      break 

,하지만 당신이 그 인덱스를 상향 유지해야 할 것 포함 된 주문 목록을 조작 할 때 최신 정보를 제공합니다. 그것은이 같은보고 싶은데 :

def __init__(self, *args): 
    # ... 
    self._ids = {} 

def append(self, id, value): 
    if id in ids: 
     raise ValueError('This order already exists!') 
    super(Orders, self).append(Order(id, value)) 
    self._ids[id] = len(self) - 1 

을하고, 당신은 또한 등 목록 및 변경 순서를 변경할 수있는 모든 다른 방법을 조정 다만, 당신은 자신의 ID로 빠르게 주문을 찾을 수 있습니다

def remove(self, id): 
    if id not in self._ids 
     raise ValueError('No such order exists!') 
    del self[self._ids[id]] 
1

당신은 당신을 위해이 작업을 수행하는 사용자 정의 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 접근 방식을 구현하는 시간을 가져야합니다.

+0

이들은 상대적으로 작은 목록 일 것이므로이 경우 성능은 주요 관심사가 아닙니다. –

관련 문제