在python中轻松漂亮的浮动打印?

时间:2009-10-14 15:07:39

标签: python printing formatting floating-point

我有一张浮动列表。如果我只是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 个答案:

答案 0 :(得分:88)

由于没有人添加它,应该注意的是,从Python 2.6+开始,string formating的推荐方法是使用format,为Python 3 +做好准备。

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

The new string formating syntax并不难使用,但却非常强大。

我虽然可能pprint可能有某些东西,但我没有找到任何东西。

答案 1 :(得分:74)

更永久的解决方案是继承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]更简洁

答案 2 :(得分:37)

你可以这样做:

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

答案 3 :(得分:22)

请注意,您还可以将字符串乘以“%。2f”(例如:“%。2f”* 10)。

>>> print "%.2f "*len(yourlist) % tuple(yourlist)
2.00 33.00 4.42 0.31 

答案 4 :(得分:15)

这是一个老问题,但我添加了一些有用的东西:

我知道你在原始Python列表中编写了你的​​例子,但如果你决定使用numpy数组(这在你的例子中是完全合法的,因为你似乎在处理数字数组),那里是(几乎完全)你说的这个命令:

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

或者在你的情况下甚至更好,如果你仍然希望看到真正精确数字的所有小数,但是除去尾随的零,例如,使用格式化字符串%g

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

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

答案 5 :(得分:8)

print "[%s]"%", ".join(map(str,yourlist))

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

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

答案 6 :(得分:5)

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

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]

答案 7 :(得分:4)

List 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

答案 8 :(得分:4)

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

,那么这将毫无用处

答案 9 :(得分:4)

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

答案 10 :(得分:3)

你可以使用熊猫。

以下是列表示例:

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

如果你有一个dict d,并且你想把它的键作为行:

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

另一种将dict提供给DataFrame的方法:

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

答案 11 :(得分:2)

我在尝试使用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])

我最初使用了生成器表达式,但pprint只是重新编写了生成器...

答案 12 :(得分:2)

首先,集合中的元素打印它们的repr。您应该了解__repr____str__

这是print repr(1.1)和print 1.1之间的区别。让我们加入所有这些字符串而不是表示:

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)

答案 13 :(得分:1)

我遇到了这个问题,但这里的解决方案都没有完全我想要的东西(我希望打印输出是一个有效的python表达式),那么怎么样:

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()应该是更标准的解决方案,但我发现它更具可读性)

答案 14 :(得分:1)

要控制重要位数,请使用格式说明符%g。

让我们来命名Emile的解决方案prettylist2f。这是经过修改的:

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 formatting

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]

答案 15 :(得分:0)

以下代码对我很有用。

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

答案 16 :(得分:0)

从Python 3.6开始,您可以使用f-strings:

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

print(*[f"{element:.2f}" for element in list_])
#9.00 0.05 0.03 0.01 0.06 0.08

您可以使用打印参数,同时保持代码的可读性:

print(*[f"{element:.2f}" for element in list_], sep='|', end='<--')
#9.00|0.05|0.03|0.01|0.06|0.08<--

答案 17 :(得分:0)

a = [9.0, 0.052999999999999999, 0.032575399999999997, 0.010892799999999999, 0.055702500000000002, 0.079330300000000006]
print(", ".join(f'{x:.2f}' for x in a))

f'{x}' 表示 f-string 等于 str(x)f'{x:.2f}' 表示 x 将显示为带有两位小数的浮点数。

答案 18 :(得分:-1)

我同意SilentGhost的评论,for循环并没有那么糟糕。你可以通过以下方式实现目标:

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