簡而言之:如何檢查python中的巨大列表是否發生了變化? hashlib
需要一個緩衝區,並且構建該列表的字符串表示形式是不可行的。檢查python中的巨大列表是否已更改
總之:我有一大堆代表數據的字典。我對這些數據進行了大量的分析,但是所有分析都需要一些元數據方面的信息。一組主題(列表中的每個詞典都有一個主題關鍵詞,有時我只需要列出數據集中存在數據的所有主題)。所以我想實現如下:
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
的問題是如何實現has_changed
方法,或者更具體地說,get_hash
(每個對象已有一個__hash__
方法,但默認情況下它只是返回對象的id
,當我們例如將一個元素附加到列表中時,它不會改變)。
你的'change_data'方法是怎麼樣的?此外'self.subjects'可以建立爲'self.subjects = set(datum ['subject']爲datum in self.data)''。 – eumiro 2012-03-26 11:24:37
我想你可能需要提供一些更多的細節。你有新舊版本嗎?你可以使用frozendicts?訂單是否重要?您的代碼是否創建了更改? – Marcin 2012-03-26 11:29:12
只要你改變'data',你能設置一個'has_changed'實例變量嗎?否則,你可能需要一個代理對象來委託所有的東西,但將'has_changed'委託給真正的'data'。 – agf 2012-03-26 11:35:52