用python轻松漂亮地打印浮动?

2024-04-23 09:13:03 发布

您现在位置: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]

Tags: import数据结构列表forfloatprecisionoptionsprint
3条回答

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

我知道您是在原始的Python列表中编写示例的,但是如果您决定使用numpy数组(这在您的示例中是完全合法的,因为您似乎正在处理数字数组),那么(几乎完全正确地)有一个您说您编写的命令:

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

如果您仍然希望看到真正精确的数字的所有小数,但要去掉尾随的零(例如,使用格式化字符串%g),则情况会更好:

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

要只打印一次而不更改全局行为,请使用与上述参数相同的np.array2string

一个更持久的解决方案是子类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进行子类划分,但不介意定义函数,map(f, x)[f(n) for n in x]简洁得多

正如noone所添加的,应该注意的是,从Python 2.6+开始,推荐的方法是使用^{},为Python 3+做好准备。

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

The newstring formating syntax不难使用,但功能相当强大。

我想那可能是^{}可能有什么东西,但我什么也没找到。

相关问题 更多 >