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

répondre à tous(1)
刘奇

Regardez le nom de la classe. La fonction de cette classe devrait être de garantir que la paire clé-valeur écrite dans le dernier appel est à la fin. la paire clé-valeur est au début de.

a = LastUpdatedOrderedDict(256)
a[3] = 4  
a[5] = 6
print a # 按照键值对的插入顺序,打印的是LastUpdatedOrderedDict([(3, 4), (5, 6)])
a[3] = 2
print a # 这个时候,又更新了下,以3为key的键值对应该放在后面,打印的是LastUpdatedOrderedDict([(5, 6), (3, 2)])

a est un objet instancié, avec 3 paires clé-valeur insérées respectivement, voir
1) 3 -> 4
2) 5 -> 2
Les clés de 1) et 3) sont les mêmes, mais les valeurs sont différentes. La classe signifie qui écrit les données plus tard, qui est derrière l'étape 2), l'objet est LastUpdatedOrderedDict. ( [(3, 4), (5, 6)])
Lors de l'exécution de l'étape 3, étant donné que votre dictionnaire est un dictionnaire ordonné et que la paire clé-valeur à insérer ultérieurement se trouve à l'arrière, le résultat attendu est LastUpdatedOrderedDict([(5, 6), (3 , 2)]).
Si vous ne supprimez pas la clé ici, seul le tableau d'origine sera mis à jour pendant __setitem__, et le résultat sera
LastUpdatedOrderedDict([(3, 2), (5, 6)])
Donc vous devez supprimer la clé par Del, perturber la structure précédente, puis insérer la paire clé-valeur.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal