浮点数的简单美观打印?

120 投票
19 回答
320820 浏览
提问于 2025-04-15 15:04

我有一个浮点数的列表。如果我直接用 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]

19 个回答

84

一个更持久的解决方案是创建一个 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 的子类会导致一些代码出现问题,特别是那些明确在检查变量类型的代码。不过,除了这个问题,我没发现其他的麻烦。而且用简单的 x = map(float, x) 就可以把转换回到 prettyfloat

可悲的是,你不能直接修改 float.__repr__,因为 float 是不可变的。

如果你不想创建 float 的子类,但又不介意定义一个函数的话,使用 map(f, x) 会比 [f(n) for n in x] 简洁很多。

116

因为没有人提到这一点,所以需要说明的是,从Python 2.6开始,推荐的字符串格式化方法是使用format,这样可以为将来使用Python 3做好准备。

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

新的 字符串格式化语法并不难用,而且功能非常强大。

我曾想过pprint可能会有一些相关内容,但我没有找到任何信息。

31

这是个老问题,但我想补充一些可能有用的内容:

我知道你用的是普通的Python列表,但如果你决定用numpy数组(这在你的例子中是完全可以的,因为你似乎在处理数字数组),那么你可以用一个几乎和你自己想出来的命令一样的指令:

import numpy as np
np.set_printoptions(precision=2)

如果你想看到非常精确数字的所有小数位,但又想去掉多余的零,可以使用格式化字符串%g,这样效果会更好:

np.set_printoptions(formatter={"float_kind": lambda x: "%g" % x})

如果只是想打印一次,不想改变全局设置,可以用np.array2string,参数和上面的一样。

撰写回答