In breve: qual è il modo a digiuno per controllare se una lista enorme in python è cambiata? hashlib
necessita di un buffer e la creazione di una rappresentazione di stringa di tale elenco non è fattibile.Controlla se l'enorme lista in python è cambiata
A lungo: ho una lista ENORME di dizionari che rappresentano i dati. Eseguo una serie di analisi su questi dati, ma ci sono alcuni aspetti dei metadati che sono richiesti da tutte le analisi, es. l'insieme di soggetti (ogni dict nella lista ha una chiave soggetto, e a volte ho solo bisogno di un elenco di tutti i soggetti che hanno dati presenti nel set di dati.). Così mi piacerebbe implementare la seguente:
class Data:
def __init__(self, ...):
self.data = [{...}, {...}, ...] # long ass list of dicts
self.subjects = set()
self.hash = 0
def get_subjects(self):
# recalculate set of subjects only if necessary
if self.has_changed():
set(datum['subject'] for datum in self.data)
return self.subjects
def has_changed(self):
# calculate hash of self.data
hash = self.data.get_hash() # HOW TO DO THIS?
changed = self.hash == hash
self.hash = hash # reset last remembered hash
return changed
La domanda è come implementare il metodo has_changed
, o più specificamente, get_hash
(ogni oggetto ha già un metodo di __hash__
, ma di default restituisce solo l'oggetto del id
, che non cambia quando ad esempio aggiungiamo un elemento ad una lista).
Come si presenta il metodo 'change_data'? Anche 'self.subjects' può essere costruito come' self.subjects = set (datum ['subject'] per datum in self.data) '. – eumiro
Penso che potrebbe essere necessario fornire ulteriori dettagli. Hai entrambe le versioni vecchie e nuove? Puoi usare frozendicts? L'ordine è importante? Il tuo codice sta creando le modifiche? – Marcin
Puoi semplicemente avere una variabile di istanza 'has_changed' che imposti ogni volta che cambi i' dati'? Altrimenti, probabilmente hai bisogno di un oggetto proxy per delegare tutto tranne 'has_changed' ai veri' dati'. – agf