我有代码
from struct import pack
self.data = {'SYNC' : 0x16, 'SOH' : 0x01,
'FnCode' : 0x55, 'pacingState' : 0,
'pacingMode' : 6, 'hysteresis' : 0,
'hysteresisInterval' : 300, 'lowrateInterval' : 1000,
'vPaceAmp' : 3500, 'vPaceWidth' : 4,
'VRP' : 320, 'spare' : '\x00\x00\x00\x00\x00'}
print(self.data.keys())
print(self.data.values())
pack('BBBBBBHHHHH5s', self.data.values())
我得到了输出,
dict_keys(['pacingState','SYNC','hysteresis','FnCode','spare','lowrateInterval','vPaceWidth','VRP','SOH','pacingMode','hysteresisInterval', 'vPaceAmp'])
dict_values([0,22,0,85,'\ x00 \ x00 \ x00 \ x00 \ x00',1000,4,320,1,6,300,3500])
为什么不按照我在字典中写入的顺序中的值(以及如何按顺序获取它们)?
此外,当我尝试执行pack函数时,我说该包需要12个参数,而data.values有12个值,所以我不确定为什么它会给我一个错误。
我尝试使用对包含值的数组的引用来创建一个dict(因此我可以传递数组,因为它的顺序正确),但更改字典值并不影响它引用的实际值数组,以便想法已经结束......
提前致谢。
答案 0 :(得分:3)
字典不维护密钥的插入顺序,因为它们是哈希表,并且不跟踪密钥插入顺序。如果你需要一个有序字典,Python 2.7和3.1有collections.OrderedDict
。如果您使用的是较旧的Python版本check out this ActiveState recipe。
至于你的pack
抱怨的原因 - 你实际上并没有传递12个参数(只要你的格式字符串是),你传递一个参数就是一个列表。
编辑 delnan的帖子向您展示如何解压缩您的值。
答案 1 :(得分:3)
collections.OrderedDict
(或者如果您使用标准库中没有它们的旧版本,则可以通过Internet进行各种实施)。或者也许您可以使用list
值(假设您不需要密钥并仅将它们用于文档),这是订购的。data.values()
。这是一个论点,即使它碰巧是12个对象的集合。使用pack(... ,*data.values())
将长度为12的序列解压缩为12个单独的参数。