简单漂亮的花车打印?

我有一个花车列表,如果我简单地把它 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]
291782 次浏览

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

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

名单公司是你的朋友。

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

你可以这样做:

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

我相信 Python 3.1将在默认情况下更好地打印它们,而不会改变任何代码。但是如果您使用的扩展还没有更新到 Python 3.1中,那么这是无用的

我同意 SilentGhost 的说法,for 循环没有那么糟糕:

l = [9.0, 0.052999999999999999, 0.032575399999999997, 0.010892799999999999, 0.055702500000000002, 0.079330300000000006]
for x in l: print "%0.2f" % (x)
print "[%s]"%", ".join(map(str,yourlist))

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

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

由于没有人添加它,应该指出的是,从 Python 2.6 + 向前推荐的 字符串格式化字符串格式化方法是使用 format,以便为 Python 3 + 做好准备。

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

新的 string formating syntax不难使用,但是功能很强大。

我想这可能是 pprint有什么,但我没有找到任何东西。

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

一个更持久的解决方案是将 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是不可变的。

If you don't want to subclass float, but don't mind defining a function, map(f, x) is a lot more concise than [f(n) for n in x]

I just ran into this problem while trying to use pprint to output a list of tuples of floats. 嵌套式理解可能不是个好主意,但我是这么做的:

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 只代表了生成器..。

你可以用熊猫。

下面是一个列表示例:

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

如果您有一个 dictd,并且希望它的键作为行:

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 的方法:

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

我遇到过这个问题,但是这里的解决方案都没有达到我想要的 没错(我希望打印出来的输出是一个有效的 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 ()应该是更标准的解决方案,但是我发现这个更可读)

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

list = map (lambda x: float('%0.2f' % x), list)
l = [9.0, 0.052999999999999999, 0.032575399999999997, 0.010892799999999999, 0.055702500000000002, 0.079330300000000006]

巨蟒2:

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

巨蟒3:

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

产出:

9.00, 0.05, 0.03, 0.01, 0.06, 0.08

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

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]

若要控制 意义重大数字的数目,请使用格式说明符% g。

让我们把 Emile 的解决方案命名为 pretty tylist2f,下面是修改后的解决方案:

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]

在 Python 3.6中,可以使用 f-string:

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<--

It's an old question but I'd add something potentially useful:

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

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

如果您仍然希望看到所有精确数字的小数,但是去掉后面的零,例如,使用格式化字符串 %g:

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

如果只打印一次而不更改全局行为,则使用带有与上面相同参数的 np.array2string

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

f'{x}'表示等于 str(x)的 f 字符串; f'{x:.2f}'表示 x将以小数点后两位的浮点数表示。