7
votes

Python struct déballer dans un dict

structure.unpack va déballer les données dans un tuple. Y a-t-il un équivalent qui stockera des données dans une dicte à la place?

Dans mon problème particulier, je traite un format binaire de largeur fixe. Je veux pouvoir être capable, en une fois tombé, de décompresser et de stocker les valeurs dans une dict (actuellement, je traverse manuellement la liste et assigner des valeurs dictoires)


3 commentaires

Je ne le pense pas. Mais le constructeur dict peut prendre une liste ou un itérateur de paires (nom, valeur) pour initialiser avec. Cela pourrait vous aider.


Vous pouvez également être intéressé par NamedTuple si vous n'avez pas besoin de modifier l'objet après la création.


Que pensez-vous que les clés soient?


3 Réponses :


8
votes

Voulez-vous quelque chose comme ça? XXX


4 commentaires

C'est ce que je fais maintenant. J'espérais quelque chose d'un peu slicker


C'est une liste qui se fait traverser (sauf si ZIP ne fait que quelque chose d'intelligent qui ne nécessite pas de marcher dans la liste).


Je sens que cette solution va bien, et déjà slicker que de mucking avec collections.NamedTupple


Tout comme un de côté, cette méthode est beaucoup plus rapide que la version TUPLE nommée



9
votes

Si vous êtes sur 2,6 ou plus récent, vous pouvez utiliser NamedTuple + STRUCT.PACK / DEPACK THIS THIS:

import collections
import struct

Point = collections.namedtuple("Point", "x y z")

data = Point(x=1, y=2, z=3)

packed_data = struct.pack("hhh", *data)
data = Point(*struct.unpack("hhh", packed_data))

print data.x, data.y, data.z


0 commentaires

6
votes

8 commentaires

Heh devrait probablement avoir vérifié le document Web. Aucune indication de cela dans le python aide (STRIT)


réponse intéressante. Je vois que c'est une fonction générée de manière dynamique, mais pourquoi: _Asdict () avec un soulignement préparé?


Utilisation de méthodes privées - bonne idée.


@FogleBird - Je ne sais pas ce que vous entendez par des méthodes privées. NamedTUPLE._ASDICT () est documenté ici: Python.org/doc//Currrent/Library/... . Et j'ai pris l'utilisation de namedTuple._make () directement à partir de la documentation liée à la réponse. Quelle est la meilleure pratique recommandée ici?


Les espaces après Raymond me rendent fou de déboguer le code.


Pourquoi le code ne peut pas exécuter sous Python3: TypeError: 'str' ne prend pas en charge l'interface tampon ?


Vous pouvez réécrire la cinquième ligne plus concis en tant qu'étudiant (* structure.unpack ('<10shhb', enregistrement))) ._ asdict ()


Cette solution est significativement plus lente que dict (zip (touches, structure.unpack (...)))