2017-06-01 1 views
1

J'essaie d'imprimer un dictionnaire ordonné en utilisant OrderedDict, mais lorsque je l'imprime, "OrderedDict" imprime également. Pour info, c'est juste un segment de code, pas tout le code. Que puis-je faire pour résoudre ce problème? J'utilise Python 3.2"OrderedDict()" Lui-même l'impression lors de l'utilisation OrderedDict()

ressemble à ceci:

def returnAllStats(ints): 
    choices = ["Yes","No"] 
    dictInfo = {"Calories":ints[2], "Servings per Container":ints[0], "Amount per Serving":ints[1], "Total Fat":(ints[3]/100)*ints[2], "Saturated Fat":(ints[4]/100)*(ints[3]/100)*ints[2], "Cholesterol":ints[5], "Fiber":ints[6], "Sugar":ints[7], "Protein":ints[8], "Sodium":ints[9], "USA":choices[ints[10]], "Caffeine":ints[11]} 
    dictInfo = collections.OrderedDict(dictInfo) 
    return dictInfo 

Et j'obtenir ce dans le fichier texte auquel ce écrit:

('snack', 'bananana')OrderedDict([('USA', 'No'), ('Sodium', 119), ('Calories', 479), ('Servings per Container', 7), ('Sugar', 49), ('Saturated Fat', 37.553599999999996), ('Total Fat', 234.71), ('Cholesterol', 87), ('Amount per Serving', 40), ('Fiber', 1), ('Caffeine', 7), ('Protein', 53)]) 

Merci!

+0

Vous savez que dans votre exemple l'ordre de sortie de 'dictInfo' est UNORDERED puisque vous créez d'abord un dict régulier avant de créer un' OrderedDict' à partir de ça, n'est-ce pas? – dawg

Répondre

4

Vous avez plusieurs options.

Vous pouvez utiliser une compréhension de liste et imprimer que:

>>> od 
OrderedDict([('one', 1), ('two', 2), ('three', 3)]) 
>>> [(k,v) for k,v in od.items()] 
[('one', 1), ('two', 2), ('three', 3)] 

Ou, sachant que l'ordre peut changer, vous pouvez simplement convertir en un dict si vous voulez que la sortie:

>>> dict(od) 
{'one': 1, 'two': 2, 'three': 3} 

(Avec Python 3.6, un dictdoes maintain order normal Utilisez Python 3.6 et l'ordre ne changera pas, ce qui sera probablement le cas dans le futur, mais pas encore garanti.)

Enfin, vous pouvez sous-classe OrderDict et remplacer la méthode __str__ avec un format que vous voulez:

class Mydict(OrderedDict): 
    def __str__(self): 
     return ''.join([str((k, v)) for k,v in self.items()]) 

>>> md=Mydict([('one', 1), ('two', 2), ('three', 3)]) 
>>> md  # repr 
Mydict([('one', 1), ('two', 2), ('three', 3)]) 
>>> print(md) 
('one', '1')('two', '2')('three', '3') 

(Changer la méthode __repr__ si vous voulez que la sortie du rééd d'être différent ...)


Note finale:

Avec ceci:

def returnAllStats(ints): 
    choices = ["Yes","No"] 
    dictInfo = {"Calories":ints[2], "Servings per Container":ints[0], "Amount per Serving":ints[1], "Total Fat":(ints[3]/100)*ints[2], "Saturated Fat":(ints[4]/100)*(ints[3]/100)*ints[2], "Cholesterol":ints[5], "Fiber":ints[6], "Sugar":ints[7], "Protein":ints[8], "Sodium":ints[9], "USA":choices[ints[10]], "Caffeine":ints[11]} 
    dictInfo = collections.OrderedDict(dictInfo) 
    return dictInfo 

Vous obtenez actuellement un résultat dicté UNORDERED puisque vous créez le OrderedDict à partir d'un littéral dict qui n'est pas ordonné.

Vous voulez faire à la place:

def returnAllStats(ints): 
    choices = ["Yes","No"] 
    return collections.OrderedDict([("Calories",ints[2]), ("Servings per Container",ints[0]), ("Amount per Serving",ints[1]), ("Total Fat",(ints[3]/100)*ints[2]), ("Saturated Fat",(ints[4]/100)*(ints[3]/100)*ints[2]), ("Cholesterol",ints[5]), ("Fiber",ints[6]), ("Sugar",ints[7]), ("Protein",ints[8]), ("Sodium",ints[9]), ("USA",choices[ints[10]]), ("Caffeine",ints[11])]} 
    return dictInfo 
0

Si vous ne se soucient pas de l'ordre, juste imprimer dict(YourOrderedDict), si vous vous souciez de l'ordre, vous pouvez:

for key, value in yourOrderedDict.items(): 
    print(key, value) 

Espérant qu'il help