2008-11-25 6 views
1

Je travaille avec un ensemble de données que j'ai converti en une liste de dictionnairesEst-ce que quelqu'un sait où il y a une recette pour sérialiser les données et préserver son ordre dans la sortie?

Par exemple, un élément dans ma liste est

{'reportDate': u'R20070501', 'idnum': u'1078099', 'columnLabel': u'2005', 
'actionDate': u'C20070627', 'data': u'76,000', 'rowLabel': u'Sales of Bananas'} 

Par demande

Le deuxième élément dans ma liste pourrait être:

{'reportDate': u'R20070501', 'idnum': u'1078099', 'columnLabel': u'2006', 
'actionDate': u'C20070627', 'data': u'86,000', 'rowLabel': u'Sales of Bananas'} 

Le troisième point pourrait être:

{'reportDate': u'R20070501', 'idnum': u'1078100', 'columnLabel': u'Full Year 2005', 
'actionDate': u'C20070627', 'data': u'116,000', 'rowLabel': u'Sales of Cherries'} 

Le quatrième point pourrait être:

{'reportDate': u'R20070501', 'idnum': u'1078100', 'columnLabel': u'Full Year 2006', 
'actionDate': u'C20070627', 'data': u'76,000', 'rowLabel': u'Sales of Sales of Cherries'} 

La raison pour laquelle je dois décaper c'est parce que je dois savoir toutes les façons les colonnes ont été marqués avant de consolider les résultats et les mettre en base de données. Les premier et deuxième éléments seront une ligne dans les résultats, le troisième et le quatrième seront la ligne suivante dans les résultats (après que quelqu'un ait déterminé l'étiquette de l'en-tête de colonne uniforme)

J'ai testé le pickle et j'ai pu enregistrer et récupérer mes données. Cependant, j'ai besoin de pouvoir conserver l'ordre dans la sortie. Une idée que j'ai est d'ajouter une autre clé qui serait un compteur afin que je puisse récupérer mes données et ensuite trier par le compteur. Y a-t-il un meilleur moyen?

Je ne veux pas mettre cela dans une base de données car ce n'est pas permanent.

J'ai marqué une réponse ci-dessous. Ce n'est pas ce que je reçois, donc j'ai besoin de savoir si le problème est ailleurs dans mon code.

+0

Pourquoi ne pas afficher plus d'une ligne? S'il y a plusieurs lignes ET que vous voulez que l'ordre soit préservé parmi les lignes, alors un meilleur exemple pourrait aider à expliquer les choses. –

Répondre

5

Alors quel est le problème avec cornichon? Si vous structurez vos données sous la forme d'une liste de dictionnaires, tout devrait fonctionner comme vous le souhaitez (si je comprends votre problème).

>>> import pickle 
>>> d1 = {1:'one', 2:'two', 3:'three'} 
>>> d2 = {1:'eleven', 2:'twelve', 3:'thirteen'} 
>>> d3 = {1:'twenty-one', 2:'twenty-two', 3:'twenty-three'} 
>>> data = [d1, d2, d3] 
>>> out = open('data.pickle', 'wb') 
>>> pickle.dump(data, out) 
>>> out.close() 
>>> input = open('data.pickle')  
>>> data2 = pickle.load(input) 
>>> data == data2 
True 
1

Python ne retient pas l'ordre dans les dictionnaires.
Cependant, il existe la classe OrderedDict dans le module collections.

Une autre option serait d'utiliser une liste de tuples:

[('reportDate', u'R20080501'), ('idnum', u'1078099'), ...etc] 

Vous pouvez utiliser le construit en dict() si vous avez besoin de convertir en un dictionnaire plus tard.

1

Le dict Python est un conteneur non ordonné. Si vous devez conserver l'ordre des entrées, vous devriez envisager d'utiliser une liste de 2-tuples.

Une autre option consisterait à conserver une liste supplémentaire des clés. De cette façon, vous pouvez bénéficier de l'accès rapide, clé offert par le dictionnaire, tout en étant capable de parcourir à travers ses valeurs de façon ordonnée:

data = {'reportDate': u'R20070501', 'idnum': u'1078099', 
     'columnLabel': u'2005', 'actionDate': u'C20070627', 
     'data': u'76,000', 'rowLabel': u'Sales of Bananas'} 
dataOrder = ['reportDate', 'idnum', 'columnLabel', 
      'actionDate', 'data', 'rowLabel'] 

for key in dataOrder: 
    print key, data[key] 
Questions connexes