字典表现怪异,以及如何打包成二进制

时间:2010-11-05 14:50:26

标签: python struct

我有代码

    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(因此我可以传递数组,因为它的顺序正确),但更改字典值并不影响它引用的实际值数组,以便想法已经结束......

提前致谢。

2 个答案:

答案 0 :(得分:3)

字典不维护密钥的插入顺序,因为它们是哈希表,并且不跟踪密钥插入顺序。如果你需要一个有序字典,Python 2.7和3.1有collections.OrderedDict。如果您使用的是较旧的Python版本check out this ActiveState recipe

至于你的pack抱怨的原因 - 你实际上并没有传递12个参数(只要你的格式字符串是),你传递一个参数就是一个列表。

编辑 delnan的帖子向您展示如何解压缩您的值。

答案 1 :(得分:3)

  1. 字典无序。好吧,当他们感觉到它们时,它们不会突然重新排序,但它们不会保留插入顺序或排序或任何东西。始终将它们视为随机顺序。您可以使用collections.OrderedDict(或者如果您使用标准库中没有它们的旧版本,则可以通过Internet进行各种实施)。或者也许您可以使用list值(假设您不需要密钥并仅将它们用于文档),这是订购的。
  2. 关于需要12个参数的包:你只给它一个参数,data.values()。这是一个论点,即使它碰巧是12个对象的集合。使用pack(... ,*data.values())将长度为12的序列解压缩为12个单独的参数。