Tóm lại: cách nhịn ăn để kiểm tra xem danh sách lớn trong python có thay đổi không? hashlib
cần một bộ đệm và xây dựng một chuỗi đại diện của danh sách đó là không khả thi.Kiểm tra xem danh sách lớn trong python đã thay đổi
Lâu: Tôi có danh sách HUGE từ điển đại diện cho dữ liệu. Tôi chạy một số phân tích về dữ liệu này, nhưng có một vài khía cạnh siêu dữ liệu được yêu cầu bởi tất cả các phân tích, tức là. tập hợp các chủ đề (mỗi dict trong danh sách có một khóa chủ đề, và đôi khi tôi chỉ cần một danh sách của tất cả các đối tượng có dữ liệu có trong tập dữ liệu.). Vì vậy, tôi muốn thực hiện những điều sau:
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
Câu hỏi đặt ra là làm thế nào để thực hiện các phương pháp has_changed
, hay cụ thể hơn, get_hash
(mỗi đối tượng đã có một phương pháp __hash__
, nhưng theo mặc định nó chỉ trả về đối tượng của id
, không thay đổi khi chúng ta ví dụ thêm một phần tử vào danh sách).
Phương thức 'change_data' của bạn trông như thế nào? Cũng 'self.subjects' có thể được xây dựng như' self.subjects = set (datum ['subject'] cho datum trong self.data) '. – eumiro
Tôi nghĩ bạn có thể cần cung cấp thêm một số chi tiết. Bạn có cả phiên bản cũ và mới không? Bạn có thể sử dụng frozendicts? Liệu trật tự có quan trọng không? Mã của bạn có tạo thay đổi không? – Marcin
Bạn có thể chỉ có biến thể 'has_changed' mà bạn đặt bất cứ khi nào bạn thay đổi' dữ liệu'? Nếu không, bạn có thể cần một đối tượng proxy để ủy nhiệm mọi thứ nhưng 'has_changed' thành' dữ liệu' thực. – agf