Python: 如何与静态引用比较字典?
我需要检查一个字典(就是一种数据结构)是否和昨天的一样,看看它有没有变化。
在PHP中,我可以把一个数组变成字符串,然后比较昨天和今天的字符串。不过,我不知道在Python中怎么做。我读过一点关于Pickle的东西,也许可以用md5来实现?
总之,我需要一种方法,把字典拆解成一个可以比较、可以存储的值,这个值不能是文件,而且可以直接写在.py文件里。
谢谢,
A.R.
6 个回答
0
pickle
绝对是你需要的东西。
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变量会包含一个字典的序列化版本。你可以把它存储在memcache或者数据存储中,以便以后进行比较。
4
字典的问题在于它们的顺序是没有定义的。你需要确保在比较字典时,如果它们相等,得到的结果总是一样的(如果你想把它们当作字符串来比较的话)。
你可以用几种方法来做到这一点:
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) Pickling(序列化)
import pickle
serializedString = pickle.dumps({1 : 2, 3 : 4})
pickle
模块有不同的协议(而且我觉得它不会对字典的项进行排序),所以你不能直接进行字符串比较。你需要先将数据反序列化为字典,然后再直接比较旧的字典和新的字典(d = pickle.loads(serializedString)
)。
4) 项元组表示法(序列化)
根据你的评论,你想要一些可以嵌入到Python源代码中的东西。正如S.Lott建议的,你可以使用someDictionary.items()
的对象表示法,它是一个包含所有(键,值)组合的元组的列表(很可能是无序的):
>>> repr({1 : 2, 3 : 4}.items())
'[(1, 2), (3, 4)]'
如果你想把这个对象序列化为字符串,可以直接复制粘贴这个表示法到你的源代码中。