我有一些列表和包含浮点数的更复杂的结构。打印时,我看到有很多十进制数字的浮点数,但是在打印时,我不需要全部。 所以我想在打印浮点数时定义一个自定义格式(例如2或3个小数)。
我需要使用浮点数而不是十进制数。另外,我不允许截断/圆形浮动。
有没有办法更改默认行为?
答案 0 :(得分:9)
你不允许使用monkeypatch C类型,比如Ignacio说。
但是,如果您非常紧迫并且知道某些C,那么您可以自己修改Python解释器源代码,然后将其重新编译为自定义解决方案。一旦我修改了列表的标准行为之一,它只是一种中度的痛苦。
我建议您找到更好的解决方案,例如使用"%0.2f"
printf表示法打印浮点数:
for item in mylist:
print '%0.2f' % item,
或
print " ".join('%0.2f' % item for item in mylist)
答案 1 :(得分:4)
不,因为这需要修改float.__str__()
,但不允许您使用monkeypatch C类型。请改用字符串插值或格式。
答案 2 :(得分:3)
我今天遇到了这个问题,我想出了一个不同的解决方案。如果你担心打印时的样子,你可以用自定义的stdout文件对象替换它,当调用write()时,它会搜索任何看起来像浮点数的东西,并用你自己的格式替换它们。它们。
class ProcessedFile(object):
def __init__(self, parent, func):
"""Wraps 'parent', which should be a file-like object,
so that calls to our write transforms the passed-in
string with func, and then writes it with the parent."""
self.parent = parent
self.func = func
def write(self, str):
"""Applies self.func to the passed in string and calls
the parent to write the result."""
return self.parent.write(self.func(str))
def writelines(self, text):
"""Just calls the write() method multiple times."""
for s in sequence_of_strings:
self.write(s)
def __getattr__(self, key):
"""Default to the parent for any other methods."""
return getattr(self.parent, key)
if __name__ == "__main__":
import re
import sys
#Define a function that recognises float-like strings, converts them
#to floats, and then replaces them with 1.2e formatted strings.
pattern = re.compile(r"\b\d+\.\d*\b")
def reformat_float(input):
return re.subn(pattern, lambda match: ("{:1.2e}".format(float(match.group()))), input)[0]
#Use this function with the above class to transform sys.stdout.
#You could write a context manager for this.
sys.stdout = ProcessedFile(sys.stdout, reformat_float)
print -1.23456
# -1.23e+00
print [1.23456] * 6
# [1.23e+00, 1.23e+00, 1.23e+00, 1.23e+00, 1.23e+00, 1.23e+00]
print "The speed of light is 299792458.0 m/s."
# The speed of light is 3.00e+08 m/s.
sys.stdout = sys.stdout.parent
print "Back to our normal formatting: 1.23456"
# Back to our normal formatting: 1.23456
如果您只是将数字放入字符串中,这并不好,但最终您可能希望将该字符串写入某处某种文件,并且您可以使用上述对象包装该文件。显然有一点性能开销。
公平警告:我没有在Python 3中测试过这个,我不知道它是否会起作用。
答案 3 :(得分:1)
>>> a = 0.1
>>> a
0.10000000000000001
>>> print a
0.1
>>> print "%0.3f" % a
0.100
>>>
从Python docs,repr(a)
会给出17位数字(只需在交互式提示下输入a
即可看到,但是str(a)
(在打印时会自动执行)轮到12。
编辑:最基本的黑客解决方案...... 你必须使用自己的课程,所以...是的。
>>> class myfloat(float):
... def __str__(self):
... return "%0.3f" % self.real
>>> b = myfloat(0.1)
>>> print repr(b)
0.10000000000000001
>>> print b
0.100
>>>
答案 4 :(得分:1)
这不能回答更常见的嵌套在其他结构中的浮点数的问题,但是,如果您只需要在列表甚至是类似数组的嵌套列表中打印浮点数,请考虑使用numpy
。
例如
import numpy as np
np.set_printoptions(precision=3, suppress=False)
list_ = [[1.5398, 2.456, 3.0],
[-8.397, 2.69, -2.0]]
print(np.array(list_))
给予
[[ 1.54 2.456 3. ]
[-8.397 2.69 -2. ]]
答案 5 :(得分:0)
升级到Python 3.1。它不会使用超过必要的数字。
Python 3.1.2 (r312:79147, Apr 15 2010, 15:35:48)
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 0.1
0.1
答案 6 :(得分:-1)
如果您使用的是C语言,则可以使用#define
或"%*.*f"
这样做,例如
printf("%*.*f",4,2,variable);