9
votes

Nidifie avec NamedTuple

J'ai des difficultés à obtenir mes données sous la forme que je voudrais dans Python.

En gros, j'ai un programme qui lit en données binaires et fournit des fonctions pour la traçabilité et l'analyse sur lesdites données. P>

Mes données ont des en-têtes principales, puis sous-titres pouvant être un nombre quelconque de types de données variés. P>

J'aimerais pouvoir accéder à mes données comme par exemple: P>

self.elements.electron.distributionfunction.


2 commentaires

Pouvez-vous s'il vous plaît nous montrer les données d'exemple?


@Abhijit C'est assez compliqué et est lu sous forme de données binaires. Le nombre d'éléments chimiques est variable de fichier à fichier, mais chaque élément a: «Nom (String) de la charge de masse (double précision) grille de vélocité 3D (3 * N * double précision) grille de phasespace (N ^ 6 * Double précision) 'J'ai une classe qui lit le binaire et le lit en variables, mais j'ai du mal à créer la structure de données accessible de la manière dont j'ai décrit.


4 Réponses :


5
votes

Sans connaître vos données, nous ne pouvons que donner une solution générique.

Considérant que les deux premières lignes contiennent les en-têtes et la sous-titre, la lecture en quelque sorte vous avez déterminé la hiérarchie. Tout ce que vous avez à faire est de créer un dictionnaire hiérarchique. P>

par exemple, extension de votre exemple p> xxx pré>

donc nous devons créer un dictionnaire comme tel

 yourDict['data']['compound']['hcl']['xyzfunction']


2 commentaires

Merci pour la réponse rapide! Cela fonctionnera donc pour n'importe quel type de données? Par exemple, si certains champs sont des chaînes et certains champs sont des tableaux numpus? Alors, pourrais-je faire 'DistributionFunction': auto.Dist1 où Self.Dist1 est un tableau NUMPY 3D? Encore une fois merci! J'apprécie pleinement votre temps!


Comme vous le voyez dans l'exemple, je n'ai que des clés prévues d'être des chaînes (qui sont hach-capables). Tant que les clés sont hadrables, vous pouvez stocker tout ce qui est de la valeur, des types de données, des fonctions, des objets, de la part de la Terre que vous avez l'intention.



3
votes

Si votre nom d'élément est dynamique et obtenu à partir des données à l'exécution, vous pouvez les affecter à une dicte et accéder à celui-ci xxx

mais si vous voulez une notation en pointillé, vous pouvez créer des attributs à Temps d'exécution, par exemple xxx

Ici, je suppose que les données que vous avez, mais avec des données dans un autre format, vous pouvez faire des tours similaires


0 commentaires

2
votes

Voici une méthode pour créer de manière récursive NamedTeuples à partir de données imbriquées.

from collections import Mapping, namedtuple


def namedtuplify(mapping, name='NT'):  # thank you https://gist.github.com/hangtwenty/5960435
    """ Convert mappings to namedtuples recursively. """
    if isinstance(mapping, Mapping):
        for key, value in list(mapping.items()):
            mapping[key] = namedtuplify(value)
        return namedtuple_wrapper(name, **mapping)
    elif isinstance(mapping, list):
        return [namedtuplify(item) for item in mapping]
    return mapping

def namedtuple_wrapper(name, **kwargs):
    wrap = namedtuple(name, kwargs)
    return wrap(**kwargs)


stuff = {'data': {'elements': {'hydrogen': {'distributionfunction': 'foo'}, 
  'nitrogen': {'xyzfunction': 'bar', 
    'distributionfunction': 'baz'}
  },
  'compound': {'water': {'distributionfunction': 'lorem'}, 
    'hcl': {'xyzfunction': 'ipsum'}}}
 }

example = namedtuplify(stuff)

example.data.elements.hydrogen.distributionfunction  # 'foo'


1 commentaires

C'est bien. Le seul problème est de ne pas sérialiser avec le cornichon que le cornichon ne peut pas garder une trace de la structure. J'ai fait une version améliorée qui fait. Je posterai ci-dessous.



0
votes

J'ai eu le même problème avec JSON imbriqué, mais devait pouvoir sérialiser la sortie avec Pickle qui n'aime pas que vous créez des objets à la volée.

J'ai pris la réponse de @ Bren et l'a améliorée afin que le La structure résultante sera sérialisable avec le cornichon. Vous devez enregistrer des références à chacune des structures que vous créez dans les globaux afin que le cornichon puisse garder des onglets sur eux. xxx

L'exemple ci-dessous doit fonctionner comme suit et être sérialisé: xxx


0 commentaires