在Python中一致地格式化数字

时间:2013-02-22 09:06:52

标签: python numpy matplotlib string-formatting

我有一系列数字:

from numpy import r_
r_[10**(-9), 10**(-3), 3*10**(-3), 6*10**(-3), 9*10**(-3), 1.5*10**(-2)]

我希望将它们以形式显示在情节的传奇中:

a 10^(b)

^表示上标)

以便例如第三个数字变为3 10^(-3)

我知道我必须使用Python的字符串格式化运算符%,但我没有看到这样做的方法。有人可以告诉我如何(或告诉我另一种方式)?

2 个答案:

答案 0 :(得分:6)

如果您确定小数点后面不需要超过固定数量的位数,那么:

>>> from numpy import r_
>>> a = r_[10**(-9), 10**(-3), 3*10**(-3), 6*10**(-3), 9*10**(-3), 1.5*10**(-2)]
>>> for x in a: print "%.1e"%x
... 
1.0e-09
1.0e-03
3.0e-03
6.0e-03
9.0e-03
1.5e-02

这里的问题是您使用%.0e作为格式,最后一个数字将打印为1e-2

编辑:由于您使用的是matplotlib,因此它是一个不同的故事:您可以使用TeX渲染引擎。一个快速而又肮脏的例子:

fig = plt.figure()
ax = fig.add_subplot(111)

x = 1.5*10**(-2)
l = ("%.0e"%x).split("e")
x_str = r"$ %s \times 10^{%s}$" % (l[0], l[1] )

ax.set_title(x_str)

plt.show()

使用新的.format字符串格式确实会更清晰。

EDIT2 :仅仅为了完整性和未来的参考,以下是我对评论中OP的看法:

x = 1.5*10**(-2)
l = ("%.0e"%x).split("e")
x_str = r"$%s \times 10^{%s}$" % ( l[0], str(int(l[1])) )

这里我转换为int并返回以避免前导零:-02 - > -2等。

答案 1 :(得分:0)

list_item = (multiply_number,degree_number)
displayed_items = [list_item, list_item, ....]
for item in displayed_items:
   print '{0}*10^({1})'.format(*item)

创建包含您要显示的编号的元组列表。然后使用format()输出它们。不要忘记使用*(这用于使用元组中的每个项目)。