我正在尝试在python 3中格式化一组列。到目前为止,我没有太多运气。我设法让列打印,但我不能让它们排成一行。我试图使每个列动态化,以便它可以适应需要打印不同的信息。但是因为我试图在列格式中使用变量,所以我不断得到关键错误。知道如何解决这个问题吗?
Indicator :Min :Max
----------------------------------------------------------------------------
Traceback (most recent call last):
File "G:/test.py", line 154, in <module>
print('{heart:{heart_col_width}}:{motor:{motor_col_width}} {teen:{teen_col_width}{smoke: {smoke_col_width}}{obese:{obese_col_width}'.format(heart, motor, teen, smoke, obese ))
KeyError: 'heart'
这是我正在使用的代码。
first_row = ['Indicator',':Min',':Max']
col_width = max(len(word) for word in first_row) +20# padding
print ("".join(word.ljust(col_width) for word in first_row))
print('----------------------------------------------------------------------------')
heart=['Heart Disease Death Rate (2007)',stateheart_min(),heartdis_min(),stateheart_max(),heartdis_max()]
motor=[ 'Motor Vehicle Death Rate (2009)',statemotor_min(),motordeath_min(),statemotor_max(),motordeath_max()]
teen=['Teen Birth Rate (2009)',stateteen_min(),teenbirth_min(),stateteen_max(),teenbirth_max()]
smoke=['Adult Smoking (2010)',statesmoke_min(),adultsmoke_min(),statesmoke_max(),adultsmoke_max()]
obese=['Adult Obesity (2010)',stateobese_min(),adultobese_min(),stateobese_max(),adultobese_max()]
heart_col_width = max(len(word) for word in heart)
motor_col_width = max(len(word) for word in motor)
teen_col_width = max(len(word) for word in teen)
smoke_col_width = max(len(word) for word in smoke)
obese_col_width = max(len(word) for word in obese)
for heart, motor, teen, smoke, obese in zip(heart, motor, teen, smoke, obese ):
print('{heart:{heart_col_width}}:{motor:{motor_col_width}} {teen:{teen_col_width}{smoke: {smoke_col_width}}{obese:{obese_col_width}'.format(heart, motor, teen, smoke, obese ))
答案 0 :(得分:0)
使用时
"{whatever}".format(whatever)
format
函数不知道如何将"{whatever}"
中的 “匹配”或“连接”到{中的 中的 {1}}对于口译员来说,他们彼此无关。当format(whatever)
函数看到.format
时,它会尝试在其调用中查找关键字参数"{whatever}"
,但没有。它只知道有一个位置参数(不是 droid ......呃......它正在寻找的论点)
您可能想要了解哪些位置参数与关键字参数(检查this SO线程)一般情况下,您需要非常了解您所处理的任何Python开发的差异。
知道了,让我们回到whatever
方法:
您需要明确告诉.format
方法两个 whatevers 之间的连接:
.format
通过这样做可能更清楚:
"{whatever}".format(whatever=whatever)
所以在你的情况下,你可以这样做:
foo="hello"
"{whatever}".format(whatever=foo)
# ^ ^
# |_________________|
由于使用了这些关键字参数,如果所有列的列宽相同,则无需重新指定。您可以在字符串的不同部分重复使用它们:
for heart, motor, teen, smoke, obese in zip(heart, motor, teen, smoke, obese ):
print(
'{heart:{heart_col_width}}:{motor:{motor_col_width}}'
' {teen:{teen_col_width}{smoke:{smoke_col_width}}'
' {obese:{obese_col_width}'.format(
heart=heart, heart_col_width=heart_col_width,
motor=motor, motor_col_width=motor_col_width,
teen=teen, teen_col_width=teen_col_width,
smoke=smoke, smoke_col_width=smoke_col_width,
obese=obese, obese_col_width=obese_col_width)
)
选中string formatting tutorial(特别是examples section)。它可能会给你一些不同的想法。