Me gustaría crear una estructura de datos que se comporte como un diccionario con una funcionalidad añadida que es hacer un seguimiento de qué claves se han "consumido". Tenga en cuenta que no puedo mostrar los valores cuando se vuelven a usar.Diccionario de Python con memoria de teclas a las que se accedió?
La estructura debe soportar estos tres casos, es decir, marcar la clave cuando se consumen cuando se accede como:
if key in d:
...
d[key]
d.get(key)
Esto es lo que he escrito:
class DictWithMemory(dict):
def __init__(self, *args, **kwargs):
self.memory = set()
return super(DictWithMemory, self).__init__(*args, **kwargs)
def __getitem__(self, key):
self.memory.add(key)
return super(DictWithMemory, self).__getitem__(key)
def __contains__(self, key):
self.memory.add(key)
return super(DictWithMemory, self).__contains__(key)
def get(self, key, d=None):
self.memory.add(key)
return super(DictWithMemory, self).get(key, d)
def unused_keys(self):
"""
Returns the list of unused keys.
"""
return set(self.keys()).difference(self.memory)
Como no estoy muy familiarizado con las partes internas de Dict, ¿hay una mejor manera de lograr este resultado?
¿con qué frecuencia usar 'unused_keys()' ? si decoró al colocador para agregar claves a un conjunto y getter para tratar de eliminar las claves de este conjunto, podría tener un mejor rendimiento - no estoy seguro de la parte ** elegance **, pensó – Aprillion
A un lado: ¿por qué 'unused_keys' devuelve un ¿lista? No tiene un orden intrínseco, por lo que tiene sentido que devuelva un conjunto. –
@Thomas K: En aras de la simetría, 'keys' devuelve una lista. – badzil