Python:将dict与静态引用进行比较?

时间:2010-09-30 20:26:44

标签: python google-app-engine dictionary compare

我必须检查字典是否与昨天相同,如果它已经改变了。

在PHP中,我可以序列化一个数组并比较昨天和今天生成的字符串。但是,我不知道如何在Py中做到这一点。我读过一些关于Pickle的内容,也许可以用某种方式用md5完成?

所以基本上我需要一种方法来将一个dict拆分成一个可比较的,可存储的值,它不是一个文件,可以硬编码到.py文件中。

谢谢, A.R。

6 个答案:

答案 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绝对是您正在寻找的。

答案 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 )