2016-09-22 1 views
1

J'ai une liste de tuples où les entrées dans les tuples sont de type mixte (int, float, tuple) et veulent imprimer chaque élément de la liste sur une ligne.Impression des flottants formatés dans un tuple imbriqué de type mixte

liste Exemple:

[('520', 
    (0.26699505214910974, 9.530913611077067e-22, 1431, 
    (0.21819421133984918, 0.31446394340528838), 11981481)), 
('1219', 
    (0.2775519783082116, 2.0226340976042765e-25, 1431, 
    (0.22902629625165472, 0.32470159534237308), 14905481))] 

Je voudrais imprimer chaque tuple comme une seule ligne avec les flotteurs formatés pour imprimer au lieu de dix-millième:

[('520', (0.2669, 9.5309e-22, 1431, (0.2181, 0.3144), 11981481)), 
('1219', (0.2775, 2.0226e-25, 1431, (0.2290, 0.3247), 14905481))] 

j'utilisais pprint à obtenir tout sur une ligne

pprint(myList, depth=3, compact=True) 
> ('1219', (0.2775519783082116, 2.0226340976042765e-25, 1431, (...), 14905481))] 

mais je ne savais pas comment bien lement formater les flotteurs d'une manière pythonique. (Il doit y avoir une meilleure façon de le faire que boucler dans la liste, faire une boucle sur chaque tuple, en vérifiant if-float/if-int/if-tuple et en convertissant tous les flottants via "%6.4f" % x).

Répondre

1

Ce n'est pas exactement ce dont vous avez besoin, mais très proche, et le code est assez compact.

def truncateFloat(data): 
    return tuple(["{0:.4}".format(x) if isinstance(x,float) else (x if not isinstance(x,tuple) else truncateFloat(x)) for x in data]) 
pprint(truncateFloat(the_list)) 

Pour votre exemple, le résultat est

(('520', ('0.267', '9.531e-22', 1431, ('0.2182', '0.3145'), 11981481)), 
('1219', ('0.2776', '2.023e-25', 1431, ('0.229', '0.3247'), 14905481))) 

Vous pouvez jouer avec des options de .format() pour obtenir ce que vous voulez.

+0

Pas aussi bien que je l'imaginais (je pense qu'il devrait y avoir une fonction de formatage d'impression récursive disponible), mais faire les travaux. Merci! – Sal