Словарь действует странно, а как упаковать в двоичный - PullRequest
0 голосов
/ 05 ноября 2010

У меня есть код

    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])

Почему в словаре нет значений в том порядке, в котором я их записал (и как я могу получитьих по порядку)?

Также, когда я пытаюсь выполнить функцию пакета, я говорю, что пакету нужно 12 аргументов, а data.values ​​имеет 12 значений, поэтому я не уверен, почему он выдает ошибку.

Я пытался создать dict со ссылкой на массив, содержащий значения (чтобы я мог передать массив, так как он находится в правильном порядке), но изменение значений словаря не повлияло на массив фактических значений, на который он ссылался, так чтоИдея отсутствует ...

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 05 ноября 2010
  1. Словари не упорядочены. Ну, они не переупорядочивают, когда им это нравится, но они не сохраняют порядок вставки, не сортируются или что-то еще. Всегда обращайтесь с ними так, как если бы порядок был случайным. Вы можете использовать collections.OrderedDict (или если вы используете старую версию, которой нет в стандартной библиотеке, в Интернете есть различные реализации). Или, может быть, вы можете просто использовать list значений (при условии, что вам не нужны ключи, а используйте их только для документации), что упорядочено.
  2. Для пакета, нуждающегося в 12 аргументах: вы указываете только один аргумент, data.values(). Это один из аргументов, даже если это набор из 12 объектов. Используйте pack(... ,*data.values()), чтобы распаковать последовательность длиной 12 в 12 отдельных аргументов.
3 голосов
/ 05 ноября 2010

Словари не поддерживают порядок вставки ключей, поскольку они являются хеш-таблицами и не отслеживают порядок вставки ключей.Если вам нужен заказанный словарь, Python 2.7 и 3.1 имеет collections.OrderedDict.Если вы используете более старую версию Python, посмотрите этот рецепт ActiveState .

Относительно того, почему ваш pack жалуется - вы на самом деле не передаете ему 12 аргументов (пока вашстрока формата is), вы передаете ей один аргумент, который является списком.

edit В сообщении delnan показано, как распаковать ваши значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...