将字符串格式映射到数字列表

时间:2014-01-21 11:30:27

标签: python

有没有办法使用map函数将".2f" % (num)之类的东西映射到数字列表?

通常要打印一个数字列表,我会做类似以下的事情:

>>> a = [1.003,2.004,3.005]
>>> print " ".join(map(str, a))
1.003 2.004 3.005

但是我会用什么方法代替下划线来获得下面所需的输出?

>>> print " ".join(map(____, a))
1.00 2.00 3.01

修改

澄清一下,四舍五入并不重要。 3.00也有效。

6 个答案:

答案 0 :(得分:8)

a = [1.003,2.004,3.005]
print " ".join(map("{:.2f}".format, a))

<强>输出

1.00 2.00 3.00

注意:默认情况下,Python将3.005舍入为3.00

答案 1 :(得分:1)

要格式化所描述的列表,请使用list comprehension

>>> print " ".join("%.2f" % n for n in a)

或者,如果你真的想使用map:

>>> print " ".join(map((lambda n: "%.2f" % n), a))

如上所述,但是浮动的四舍五入有一些特点。有关详细信息,请参阅herehere

如果你真的想要精确的四舍五入,你可以用decimal.Decimal来实现这一点,例如:

>>> import decimal
>>> a = ['1.003', '2.004', '3.005']
>>> ctx = decimal.Context(prec=3, rounding=decimal.ROUND_HALF_UP)
>>> print " ".join(str(ctx.create_decimal(n)) for n in a)
['1.00', '2.00', '3.01']

然而,这意味着使用字符串而不是浮点作为输入。

答案 2 :(得分:1)

您可以使用列表推导来生成字符串并打印它们,但正如Ashwini Chaudhary在评论中所说的那样,使用字符串格式'.2f'

无法获得3.005的3.01
a = [1.003,2.004,3.005]
b = ' '.join(['{:.2f}'.format(num) for num in a])
print(b) # 1.00 2.00 3.00

答案 3 :(得分:1)

这里有很多好的解决方案。但它们似乎不符合您的预期产量。这是因为round函数处理浮点数的方式(阅读Note in the docs)。解决方案是使用小数进行精确舍入:

from decimal import *
" ".join(map(lambda x: str(Decimal(str(x)).quantize(Decimal('.01'), rounding=ROUND_HALF_UP)), a))
# '1.00 2.00 3.01'

答案 4 :(得分:0)

要获取“舍入%.2f”,您可以在输入中添加0.001

a = [1.003, 2.004, 3.005]
# add 0.001 to round up
print(' '.join(map('{:.2f}'.format, [x + 0.001 for x in a])))
1.00 2.00 3.01

例如0.005-> 0.006-> 0.01

[x + 0.001 for x in a]部分称为“列表理解”

我很确定,这比使用小数模块要快

答案 5 :(得分:0)

  datetime(2020, 4, 16, 11, 22, 32,tzinfo=<DstTzInfo 'US/Central' CDT-1 day, 19:00:00 DST>