在Python3中打印格式化的浮点数列表

4

我正在编写一个程序,它会执行以下操作:

  1. 接收多个(浮点数)以逗号分隔的输入
  2. 对列表中的所有元素执行计算
  3. 输出一个列表(浮点数保留两位小数)

我已经编写了以下程序:

import math

C = 50.0
H = 30.0
Q = []

D = input("Please input the D-Values\n").split(",")
[float(k) for k in D]
#[int(k) for k in D]

print("D = {}".format(D))

for i in D:
    j = (math.sqrt((2*C*float(i))/H))
    Q.append(j) 


print("The answers are")
print(Q)
print(type(Q[0]))
print("Q = {:.2f}".format(Q))

执行此程序时,我遇到了以下错误。
Traceback (most recent call last):
  File "/home/abrar/pythonPrograms/Challange6.py", line 24, in <module>
    print("Q = {:.2f}".format(Q))
TypeError: non-empty format string passed to object.__format__

我试图搜索解决此问题的方法,但找不到答案。如果不包括{:.2f},即使用{},程序就能正常工作。但是,输出看起来非常凌乱。

非常感谢任何帮助。

2个回答

13

你正在尝试使用格式字符串.2f格式化一个list - 你想要格式化的是列表中的float。以下是修复该错误的一种方式:

Q = [1.3, 2.4]
print(', '.join('{:.2f}'.format(f) for f in Q))
# 1.30, 2.40

从Python 3.6开始,这也可以写成:

print(', '.join(f'{q:.2f}' for q in Q))

或者你可以创建自己的类来接受格式字符串:

class FloatList(list):

    def __init__(self, *args):
        super().__init__(args)

    def __format__(self, format_spec):
        return f'[{", ".join(f"{i:{format_spec}}" for i in self)}]'


fl = FloatList(0.1, 0.33, 0.632)
print(f"{fl:.2f}")  # [0.10, 0.33, 0.63]

这个可以工作,但语法很丑陋。我希望Python未来能够引入列表线程(例如,在IDL中可以使用print,Q,format =“f0.2”)来打印完全格式化的列表Q。如果Python可以使用print(f"{Q:.2f}")来完成相同的操作,那将会更加简洁。 - divenex
@divenex 你可以继承一个序列并定义一个 __format__ 方法。这里附加了一个例子。 - hiro protagonist
谢谢。有趣的解决方案。对于一般用途来说,它相当冗长。但如果Python f-strings按照这些方式处理列表,那就很好了。 - divenex

2
你正在尝试格式化一个列表,但你想要格式化该列表中的元素,因此你需要使用*Q来替换Q*操作符将“解包”列表)。
这里是一种解决方案:
fmtL = "Q = " + ', '.join(["{:.2f}"]*len(Q))
print(fmtL.format(*Q))
Q = 1.83, 2.58, 3.16 

非常感谢。运行得很好。 - new2Ubuntu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接