>  Q&A  >  본문

python - FIFO OrderedDict的问题

from collections import OrderedDict
import unittest

class LastUpdatedOrderedDict(OrderedDict):

    def __init__(self, capacity):
        super(LastUpdatedOrderedDict, self).__init__()
        self._capacity = capacity

    def __setitem__(self, key, value):
        containsKey = 1 if key in self else 0
        # print(self)
        if len(self) - containsKey >= self._capacity:
            last = self.popitem(last=False)
            print('remove:', last)
        if containsKey:
            del self[key]
            print('set:', (key, value))
        else:
            print('add:', (key, value))
        OrderedDict.__setitem__(self, key, value)

问题:

del self[key]  有什么特殊用意么,如果key存在的话,直接让它执行OrderedDict.__setitem__()就行了吧,没必要del再重新self[key] = value吧

ps:这是在别人的代码里看到的,欢迎大家指教。

PHP中文网PHP中文网2741일 전423

모든 응답(1)나는 대답할 것이다

  • 怪我咯

    怪我咯2017-04-17 17:36:30

    클래스 이름을 보세요. 이 클래스의 기능은 마지막 호출에서 작성된 키-값 쌍이 끝에 있는지 확인하는 것입니다. 삭제하지 않으면 인쇄할 때 업데이트하면 됩니다. 키-값 쌍이 앞에 있습니다.

    으아악

    a는 각각 3개의 키-값 쌍이 삽입된 인스턴스화된 객체입니다.
    1) 3 -> 4
    2) 5 -> 6
    3) 2<을 참조하세요. 🎜>1)과 3)의 키는 같지만 값이 다릅니다. 클래스는 나중에 데이터를 쓰는 사람이 누구인지, 2) 단계를 완료하면 개체가 LastUpdatedOrderedDict( [ (3, 4), (5, 6)])
    3단계를 수행할 때 이것은 순서가 지정된 사전이고 나중에 삽입할 키-값 쌍이 마지막에 있기 때문에 예상되는 결과는 LastUpdatedOrderedDict([( 5, 6), (3, 2)]).
    여기서 키를 삭제하지 않으면 __setitem__ 중에 원래 배열만 업데이트되고 결과는
    LastUpdatedOrderedDict([(3, 2), (5, 6)])
    이 됩니다. Del 키를 삭제하고 이전 구조를 중단한 다음 키-값 쌍을 삽입해야 합니다.

    회신하다
    0
  • 취소회신하다