python - FIFO OrderedDict的问题
PHP中文网
PHP中文网 2017-04-17 17:34:30
0
1
460
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中文网

认证高级PHP讲师

全員に返信(1)
刘奇

クラスの名前を見てください。このクラスの機能は、最後の呼び出しで書き込まれたキーと値のペアが最後にあることを確認することです。削除しない場合は、印刷時にのみ更新されます。キーと値のペアは先頭にあります。

リーリー

a は、それぞれ 3 つのキーと値のペアが挿入されたインスタンス化されたオブジェクトです。
1) 3 -> 4
2) 5 -> 6
3) 21)と3)のキーは同じですが、値が異なります。クラスは、手順2)を完了したときに誰が後ろにデータを書き込むかを意味します。 (3, 4), (5, 6)])
手順 3 を実行すると、これは順序付き辞書であり、後で挿入されるキーと値のペアが最後にあるため、期待される結果は LastUpdatedOrderedDict ([( 5、6)、(3、2)])。
ここでキーを削除しないと、__setitem__ 中に元の配列のみが更新され、結果は
LastUpdatedOrderedDict([(3, 2), (5, 6)])
となります。 Del キーを削除し、以前の構造を破壊してから、キーと値のペアを挿入する必要があります。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート