我必须检查字典是否与昨天相同,如果它已经改变了。
在PHP中,我可以序列化一个数组并比较昨天和今天生成的字符串。但是,我不知道如何在Py中做到这一点。我读过一些关于Pickle的内容,也许可以用某种方式用md5完成?
所以基本上我需要一种方法来将一个dict拆分成一个可比较的,可存储的值,它不是一个文件,可以硬编码到.py文件中。
谢谢, A.R。
答案 0 :(得分:3)
字典的问题是它们的未定义顺序。您必须确保始终获得相同字典的相同结果(如果您想将它们作为字符串进行比较)。
你可以通过多种方式实现这一目标:
1) Python哈希(仅用于检查相等性;哈希实现可能特定于Python版本!)
print hash(str(sorted({1 : 2, 3 : 4}.items())))
2) MD5 (最好只检查相等)
import hashlib
print hashlib.md5(str(sorted({1 : 2, 3 : 4}.items()))).hexdigest()
3)酸洗(序列化)
import pickle
serializedString = pickle.dumps({1 : 2, 3 : 4})
pickle
模块具有不同的协议(我认为它不会对字典项进行排序),因此您无法进行字符串比较。您必须将数据unpickle到字典,然后直接比较新旧字典(d = pickle.loads(serializedString)
)。
4)项目元组表示(序列化)
根据你的评论,你想要嵌入Python源代码的东西。正如S.Lott建议的那样,您可以使用someDictionary.items()
的对象表示,这是一个包含所有(键,值)组合的列表作为元组(最可能未排序):
>>> repr({1 : 2, 3 : 4}.items())
'[(1, 2), (3, 4)]'
如果您希望将对象序列化为字符串,则可以将此表示形式复制并粘贴到源代码中。
答案 1 :(得分:1)
您可以使用JSON来获取您要求的内容。
from django.utils import simplejson as json
dict_1 = {'a': 1, 'b': 2, 'c': 3}
dict_2 = {'a': 2, 'b': 7, 'd': 9}
dict_1_str = json.dumps(dict_1, sort_keys=True)
dict_2_str = json.dumps(dict_2, sort_keys=True)
if dict_1_str == dict_2_str:
# do something with the new dict...
pass
dict_X_str变量将包含dict的序列化版本。您可以将其存储在memcahce或数据存储区中以供以后比较。
答案 2 :(得分:0)
pickle
绝对是您正在寻找的。 p>
答案 3 :(得分:0)
pickle.dumps(set(yourdict.items()))
答案 4 :(得分:0)
通过使用pickle,您可以创建一个新的DictProperty,允许您将dict放入数据存储区并稍后检索它以进行比较。
以下是一项实施:Can I store a python dictionary in google's BigTable datastore without serializing it explicitly?
答案 5 :(得分:0)
如果这样做,你会得到一个一致且可比的对象。它具有明确定义和可预测的顺序。您可以使用difflib查找差异。此外,您可以从中轻松地重建高性能字典。
static = list(sorted(some_dict.items()))
a_dict= dict( static )