在python漂浮容易漂亮的打印?

我有一个花车列表。 如果我只是简单地print它,就会显示如下:

 [9.0, 0.052999999999999999, 0.032575399999999997, 0.010892799999999999, 0.055702500000000002, 0.079330300000000006] 

我可以使用print "%.2f" ,这将需要一个for循环遍历列表,但是然后它不适用于更复杂的数据结构。 我想喜欢的东西(我完全是这样)

 >>> import print_options >>> print_options.set_float_precision(2) >>> print [9.0, 0.052999999999999999, 0.032575399999999997, 0.010892799999999999, 0.055702500000000002, 0.079330300000000006] [9.0, 0.05, 0.03, 0.01, 0.06, 0.08] 

更持久的解决scheme是子类float

 >>> class prettyfloat(float): def __repr__(self): return "%0.2f" % self >>> x [1.290192, 3.0002, 22.119199999999999, 3.4110999999999998] >>> x = map(prettyfloat, x) >>> x [1.29, 3.00, 22.12, 3.41] >>> y = x[2] >>> y 22.12 

子类化float的问题是它破坏了显式查找variablestypes的代码。 但据我所知,这是唯一的问题。 而一个简单的x = map(float, x)prettyfloat转换为prettyfloat

可悲的是,你不能只是猴子补丁float.__repr__ ,因为float是不可变的。

如果你不想介绍float ,但是不介意定义一个函数, map(f, x)map(f, x) [f(n) for n in x]更简洁。

如果没有人添加它,应该注意的是,从Python 2.6开始,推荐的string格式化方式是使用format ,为Python 3+做好准备。

 print ["{0:0.2f}".format(i) for i in a] 

新的 string格式化语法并不难,而且function强大。

我虽然可能是pprint可能有的东西,但我还没有find任何东西。

你可以做:

 a = [9.0, 0.052999999999999999, 0.032575399999999997, 0.010892799999999999, 0.055702500000000002, 0.079330300000000006] print ["%0.2f" % i for i in a] 

请注意,您也可以乘以一个string,如“%.2f”(例如:“%.2f”* 10)。

 >>> print "%.2f "*len(yourlist) % tuple(yourlist) 2.00 33.00 4.42 0.31 
 print "[%s]"%", ".join(map(str,yourlist)) 

这将避免打印时二进制表示中的舍入错误,而不会引入固定的精度约束(如使用"%.2f"格式化):

 [9.0, 0.053, 0.0325754, 0.0108928, 0.0557025, 0.0793303] 

我相信Python 3.1会默认打印它们,而不会改变任何代码。 但是,如果您使用任何尚未更新的扩展来使用Python 3.1,那就没用了

列表comps是你的朋友。

 print ", ".join("%.2f" % f for f in list_o_numbers) 

尝试一下:

 >>> nums = [9.0, 0.052999999999999999, 0.032575399999999997, 0.010892799999999999] >>> print ", ".join("%.2f" % f for f in nums) 9.00, 0.05, 0.03, 0.01 

最简单的select应该是使用舍入程序:

 import numpy as np x=[9.0, 0.052999999999999999, 0.032575399999999997, 0.010892799999999999, 0.055702500000000002, 0.079330300000000006] print('standard:') print(x) print("\nhuman readable:") print(np.around(x,decimals=2)) 

这产生输出:

 standard: [9.0, 0.053, 0.0325754, 0.0108928, 0.0557025, 0.0793303] human readable: [ 9. 0.05 0.03 0.01 0.06 0.08] 

你可以使用pandas。

这里是一个列表的例子:

 In: import pandas as P In: P.set_option('display.precision',3) In: L = [3.4534534, 2.1232131, 6.231212, 6.3423423, 9.342342423] In: P.Series(data=L) Out: 0 3.45 1 2.12 2 6.23 3 6.34 4 9.34 dtype: float64 

如果你有一个字典,你想要它的键作为行:

 In: d Out: {1: 0.453523, 2: 2.35423234234, 3: 3.423432432, 4: 4.132312312} In: P.DataFrame(index=d.keys(), data=d.values()) Out: 0 1 0.45 2 2.35 3 3.42 4 4.13 

另一种给字典赋予一个DataFrame的方法:

 P.DataFrame.from_dict(d, orient='index') 

首先,集合内的元素打印他们的repr。 你应该了解__repr____str__

这是print repr(1.1)和print 1.1之间的区别。 让我们join所有这些string,而不是表示:

 numbers = [9.0, 0.053, 0.0325754, 0.0108928, 0.0557025, 0.07933] print "repr:", " ".join(repr(n) for n in numbers) print "str:", " ".join(str(n) for n in numbers) 

我只是遇到这个问题,而试图使用pprint输出的浮动元组列表。 嵌套的理解可能是一个坏主意,但这是我做的:

 tups = [ (12.0, 9.75, 23.54), (12.5, 2.6, 13.85), (14.77, 3.56, 23.23), (12.0, 5.5, 23.5) ] pprint([['{0:0.02f}'.format(num) for num in tup] for tup in tups]) 

我首先使用了生成器expression式,但是pprint只是重新生成了生成器。

 l = [9.0, 0.052999999999999999, 0.032575399999999997, 0.010892799999999999, 0.055702500000000002, 0.079330300000000006] 

Python 2:

 print ', '.join('{:0.2f}'.format(i) for i in l) 

Python 3:

 print(', '.join('{:0.2f}'.format(i) for i in l)) 

输出:

 9.00, 0.05, 0.03, 0.01, 0.06, 0.08 

我有这个问题,但是这里没有任何解决scheme正是我想要的(我想要打印的输出是一个有效的pythonexpression式),那么怎么样:

 prettylist = lambda l : '[%s]' % ', '.join("%.2f" % f for f in l) 

用法:

 >>> ugly = [9.0, 0.052999999999999999, 0.032575399999999997, 0.010892799999999999, 0.055702500000000002, 0.079330300000000006] >>> prettylist = lambda l : '[%s]' % ', '.join("%.2f" % f for f in l) >>> print prettylist(ugly) [9.00, 0.05, 0.03, 0.01, 0.06, 0.08] 

(我知道.format()应该是更标准的解决scheme,但我觉得这更可读)

下面的代码对我很好。

 list = map (lambda x: float('%0.2f' % x), list) 

要控制有效数字的数量,请使用格式说明符%g。

让我们命名Emile的解决schemeprettylist2f。 这是修改的:

 prettylist2g = lambda l : '[%s]' % ', '.join("%.2g" % x for x in l) 

用法:

 >>> c_e_alpha_eps0 = [299792458., 2.718281828, 0.00729735, 8.8541878e-12] >>> print(prettylist2f(c_e_alpha_eps0)) # [299792458.00, 2.72, 0.01, 0.00] >>> print(prettylist2g(c_e_alpha_eps0)) # [3e+08, 2.7, 0.0073, 8.9e-12] 

如果您希望有效数字的灵活性,请改用f-string格式 :

 prettyflexlist = lambda p, l : '[%s]' % ', '.join(f"{x:.{p}}" for x in l) print(prettyflexlist(3,c_e_alpha_eps0)) # [3e+08, 2.72, 0.0073, 8.85e-12] 

我同意SilentGhost的评论,for循环没那么糟糕。 你可以达到你想要的:

 l = [9.0, 0.052999999999999999, 0.032575399999999997, 0.010892799999999999, 0.055702500000000002, 0.079330300000000006] for x in l: print "%0.2f" % (x)