Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 泡菜顺序之谜_Python_Dictionary_Serialization_Pickle_Stream Framework - Fatal编程技术网

Python 泡菜顺序之谜

Python 泡菜顺序之谜,python,dictionary,serialization,pickle,stream-framework,Python,Dictionary,Serialization,Pickle,Stream Framework,2017年6月8日更新 虽然3年过去了,但my仍在等待通过强制执行输出命令作为临时解决方案。流框架可能会重新考虑使用内容作为通知键的设计。GitHub引用了这一点 问题 见以下示例: import pickle x = {'order_number': 'X', 'deal_url': 'J'} pickle.dumps(x) pickle.dumps(pickle.loads(pickle.dumps(x))) pickle.dumps(pickle.loads(pickle.dumps(p

2017年6月8日更新

虽然3年过去了,但my仍在等待通过强制执行输出命令作为临时解决方案。流框架可能会重新考虑使用内容作为通知键的设计。GitHub引用了这一点

问题

见以下示例:

import pickle
x = {'order_number': 'X', 'deal_url': 'J'}

pickle.dumps(x)
pickle.dumps(pickle.loads(pickle.dumps(x)))
pickle.dumps(pickle.loads(pickle.dumps(pickle.loads(pickle.dumps(x)))))
结果:

(dp0\nS'deal_url'\np1\nS'J'\np2\nsS'order_number'\np3\nS'X'\np4\ns.
(dp0\nS'order_number'\np1\nS'X'\np2\nsS'deal_url'\np3\nS'J'\np4\ns.
(dp0\nS'deal_url'\np1\nS'J'\np2\nsS'order_number'\np3\nS'X'\np4\ns.
显然,每个转储的序列化输出都会发生变化。当我从任何键中删除一个字符时,这不会发生。我发现这是将pickle输出用作在其k/v存储上存储通知的密钥。如果我们能更好地了解这里发生的事情,我会提出请求。我找到了两种预防方法:

A-排序后转换为字典(是的,以某种方式提供了预期的副作用)

B-删除下划线(但不确定是否始终有效)

那么,是什么原因导致了词典对pickle进行分类的神秘性呢

通过dict调用sort提供转储以产生相同结果的证明:

import operator
x = dict(sorted(x.iteritems(), key=operator.itemgetter(1)))

pickle.dumps(x)
"(dp0\nS'order_number'\np1\nS'X'\np2\nsS'deal_url'\np3\nS'J'\np4\ns."

x = pickle.loads(pickle.dumps(x))
x = dict(sorted(x.iteritems(), key=operator.itemgetter(1)))

pickle.dumps(x)
"(dp0\nS'order_number'\np1\nS'X'\np2\nsS'deal_url'\np3\nS'J'\np4\ns."

字典是未排序的数据结构。这意味着顺序是任意的,pickle将按原样存储它们。如果要使用排序字典,可以使用

当你在口译员中玩的时候,你认为你看到的任何命令都只是口译员对你很友好

根据以下文件:

最好将字典视为一组无序的键:值对,要求键是唯一的(在一个字典中)


请记住,函数
dict.keys()
dict.values()
dict.items()
也会以任意顺序返回各自的值。

字典是未排序的数据结构。这意味着顺序是任意的,pickle将按原样存储它们。如果要使用排序字典,可以使用

当你在口译员中玩的时候,你认为你看到的任何命令都只是口译员对你很友好

根据以下文件:

最好将字典视为一组无序的键:值对,要求键是唯一的(在一个字典中)



请记住,函数
dict.keys()
dict.values()
dict.items()
也会以任意顺序返回各自的值。

dict
不会保留键的顺序。您应该考虑从<代码>集合<代码>中使用<代码> OrdDigt <代码>。字典是无序的。在定义上我同意,但如果我在每次加载后应用解决方案A,转储会神奇地产生相同的结果。因此,pickle在某种程度上受到内存顺序或其他因素的影响。因此,您宁愿想出一种方法,以您想要的方式意外地对dict排序,而不是切换到保留顺序的数据结构?您是否注意到调用
dict(sorted(x.iteritems()))
如果您选择的键是什么,那么字典的顺序总是可能的?键是不相关的,因为操作没有意义。没有区别。如果你在任何真实的环境中相信这一点,你会过得很糟糕。测试数据集还包含一个带有两个键的字典。试着用几千把钥匙换一把,看看效果如何。
dict
不能保证钥匙的顺序。您应该考虑从<代码>集合<代码>中使用<代码> OrdDigt <代码>。字典是无序的。在定义上我同意,但如果我在每次加载后应用解决方案A,转储会神奇地产生相同的结果。因此,pickle在某种程度上受到内存顺序或其他因素的影响。因此,您宁愿想出一种方法,以您想要的方式意外地对dict排序,而不是切换到保留顺序的数据结构?您是否注意到调用
dict(sorted(x.iteritems()))
如果您选择的键是什么,那么字典的顺序总是可能的?键是不相关的,因为操作没有意义。没有区别。如果你在任何真实的环境中相信这一点,你会过得很糟糕。测试数据集还包含一个带有两个键的字典。用几千个试一个,看看效果如何。你意识到,当你调用
pickle.loads(dictionary\u pickle)
时,你构建了一个具有任意顺序的字典,而不管pickle如何存储该字典?你提供的解决方案a也会在对
iteritems()的结果排序后创建一个字典
,实际上失去了秩序。它仍然解决了问题:)我同意pickle有权选择自己的演示文稿,但我强迫它保持不变,刚才为问题添加了证据。给定的
dict
在不同的运行中的顺序可能是相同的,因为输入方法是相同的,并且使用的是相同版本的Python。您的数据只是加强了这一点。您意识到,在调用
pickle.load(dictionary\u pickle)
时,您构建了一个具有任意顺序的字典,而不管pickle如何存储该字典?您提供的解决方案a也会在对
iteritems()的结果进行排序后创建一个字典,实际上失去了顺序。它仍然解决了问题:)我同意pickle有权选择自己的表示,但我强迫它保持相同,只是在问题上添加了证据。给定的
dict
的顺序可能在每次运行时都是相同的,因为输入方法是相同的,并且使用的是相同版本的Python。您的数据只是加强了这一点。
import operator
x = dict(sorted(x.iteritems(), key=operator.itemgetter(1)))

pickle.dumps(x)
"(dp0\nS'order_number'\np1\nS'X'\np2\nsS'deal_url'\np3\nS'J'\np4\ns."

x = pickle.loads(pickle.dumps(x))
x = dict(sorted(x.iteritems(), key=operator.itemgetter(1)))

pickle.dumps(x)
"(dp0\nS'order_number'\np1\nS'X'\np2\nsS'deal_url'\np3\nS'J'\np4\ns."