在python中轻松轻松地打印浮点数?


93

我有一个花车清单。如果我只是简单地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]

Answers:


23

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

我知道您是在原始Python列表中编写示例的,但是如果您决定使用numpy数组代替(这在您的示例中是完全合法的,因为您似乎正在处理数字数组),那么(几乎完全是)此命令可以说你编造了:

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

如果您仍然希望查看真正精确数字的所有小数,但要摆脱尾随零的情况,就更好了,例如,使用格式化字符串%g

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

对于仅打印一次且不更改全局行为的情况,请使用np.array2string与上述相同的参数。


102

正如没有人添加的那样,应该注意的是,从Python 2.6+开始,推荐的字符串格式化方法是使用format,以便为Python 3+做好准备。

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

新的 字符串格式语法不难使用,但功能非常强大。

我虽然pprint可能有一些东西,但是我什么也没发现。


1
这是我曾经使用过的,但我添加.replace("'", "")了摆脱那些逗号的方法。 str(["{0:0.2f}".format(i) for i in a]).replace("'", "")
Steinarr HrafnHöskuldsson17年

这将产生一个字符串列表。在打印输出中,每个元素''周围都有。例如,a=[0.2222, 0.3333]它将产生['0.22', '0.33']
jdhao

要删除顶点和逗号,您应该使用' '.join([{0:0.2f}".format(i) for i in a])
Neb

78

一个更永久的解决方案是子类化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

可悲的是,您不能只使用monkey-patch float.__repr__,因为它float是不可变的。

如果您不想继承子类float,但又不介意定义一个函数,map(f, x)则比起简单得多[f(n) for n in x]


我本以为会有一个更简单的解决方案,但是您的答案显然是最好的,因为您是唯一可以实际回答我的问题的人。
static_rtti

4
他是唯一真正回答您编辑过的问题的人。不贬低答复者,但您无法澄清问题,然后根据我们正在使用的信息略述其余的答复者。
杰德·史密斯

1
我最初的问题确实提到我认为for循环不是一个好的解决方案(对我来说,列表理解是相同的,但我同意并不清楚)。下次我会尝试变得更清晰。
static_rtti

2
[x中n的f(n)]比map(f,x)更具Python风格。
罗伯特·麦吉本

2
我不一定支持子类化float,但我认为类型检查不是有效的参数。在检查类型时,isinstance应使用,而不是相等type()。正确完成操作后,float的子类仍将计为float。
zondo

37

你可以做:

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

3
这将打印['9.00','0.05','0.03','0.01','0.06','0.08']-带引号,您通常不希望这样(我希望有一个有效的浮点列表印刷)
Emile

23

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

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

3
十分优雅!我喜欢
Nathan Fellman

2
-1骇人听闻。加入格式化的字符串,请
别无

1
所以kaizer.se,您是否建议使用“” .join([ylist.x中的x [%.2f“%x])。我必须在python中进行这种构造。
Gregg Lind)

是的,我提议," ".join("%.2f" % x for x in yourlist)因为分开格式字符串和内插值比使用丑陋的Python习语要糟糕得多。
u0b34a0f6ae 2009年

这是好奇心。为什么元组在列表失败时起作用?没有“元组”,它将导致错误。为什么?
Joonho Park

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

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

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

7
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

不知道为什么这还不高。不依赖第三方库的解决方案!
Fl.pf.

7

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

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]

这是一个很好的答案
jjz

4

我相信Python 3.1默认会更好地打印它们,而无需更改任何代码。但是,如果您使用尚未更新为与Python 3.1兼容的任何扩展,那将没有用。


1
Python 3.1将打印映射到该浮点值的最短十进制表示形式。例如:>>> a,b = float(1.1),float(1.1000000000000001)>>> a 1.1000000000000001 >>> b 1.1000000000000001 >>> print(a,b)1.1 1.1
Matt Boehm

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

5
生成器表达式会更好:“,” .join(“%。2f”%f对于list_o_numbers中的f)
efotinis 2009年

@efotinis尚未将这些添加到我的曲目中,但是您是对的-这很性感。
杰德·史密斯

1
@Jed:请阅读FAQ,“其他人可以编辑我的东西吗?!”部分:stackoverflow.com/faq。并非每个编辑都是好的编辑,但这是真正的改进。也许您可以在答案中列出这两种技术,并添加有关差异的注释?
09年

4

要控制有效位数,请使用格式说明符%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字符串格式

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]

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

如果您有字典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')

2

首先,集合中的元素打印其代表。您应该了解__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)

注意:在Python 2.7中,对于此示例,“ repr”行和“ str”行的结果相同。
ToolmakerSteve

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只是重新生成了生成器...


2

从Python 3.6开始,您可以使用f字符串:

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参数:

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

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


0

我同意SilentGhost的评论,for循环还不错。您可以通过以下方式实现您想要的:

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

3
尽管for循环并不难看,但这种用法并不是Pythonic的。
杰德·史密斯

-1

下面的代码对我来说很好。

list = map (lambda x: float('%0.2f' % x), list)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.