我试图在python中打印出列表中的dict值。
car_object = {}
cursor = self._db.execute('SELECT IDENT, MAKE, MODEL, DISPLACEMENT, POWER, LUXURY FROM CARS')
for row in cursor:
objectname = 'Car_Object_'+str(row['IDENT'])
# print (objectname)
car_object[objectname] = Cars(ident = row['IDENT'], make = row['MAKE'], model = row['MODEL'], disp = row['DISPLACEMENT'], power = row['POWER'], luxury = row['LUXURY'])
print(objectname, car_object[objectname])
#print(row['IDENT'], row['MAKE'], row['MODEL'], row['DISPLACEMENT'], row['POWER'], row['LUXURY'])
yield dict(row)
所以它正在打印:
Car_Object_meA160 {'power': 55, 'ident': 'meA160', 'model': 'A160 CDI', 'disp': 1.7, 'make': 'mercedes', 'luxury': 'N'}
Car_Object_meA190 {'power': 92, 'ident': 'meA190', 'model': 'A190', 'disp': 1.7, 'make': 'mercedes', 'luxury': 'Y'}
Car_Object_meA210 {'power': 103, 'ident': 'meA210', 'model': 'A210 EVO', 'disp': 1.7, 'make': 'mercedes', 'luxury': 'Y'}
......等等 我希望能够像这样打印出来:
IDENT MAKE MODEL DISP POWER LUX
Car_Object_meA160 meA160 mercedes A160 CDI 1.7 55 N
Car_Object_meA190 meA190 mercedes A190 1.7 92 Y
Car_Object_meA210 meA210 mercedes A210 EVO 1.7 103 Y
所以我希望能够以某种方式打印标题值....是否有可能做到这一点?感谢。
答案 0 :(得分:1)
棘手的部分是对齐几个表条目和表头。为此,我们首先要弄清楚每列中最长的条目有多长。 pad
然后可以用来为给定的字符串添加一些填充空格。
fields = ["ident", "make", "model", "disp", "power", "luxury"]
max_len = {"name": max(map(len, car_objects)) + 1}
for f in fields:
max_len[f] = max(map(len, [f] + [str(car[f]) for car in car_objects.values()]))
pad = lambda s, f: str(s).ljust(max_len[f])
现在,我们可以使用上面定义的car_objects
函数打印pad
中的标题和多个条目。
print pad("", "name") + " ".join(pad(f.upper(), f) for f in fields)
for name, car in car_objects.items():
print pad(name, "name") + " ".join(pad(car[f], f) for f in fields)
这应该有效,假设car_objects
的元素是Python字典。如果没有,请尝试在上面的代码中将car[f]
替换为getattr(c, f)
。
更新:当然,只有在实际打印之前知道所有行,才能完美地对齐表格的列。如果你必须在仍然从数据库中读取条目时打印 ,你必须“猜测”填充字符串的空格数,以便它们在表格中很好地对齐。这使得很多的一切变得更简单。只需将此行放在for
循环之前,即可打印表格标题:
print (" " * 20) + " ".join(f.upper().ljust(10) for f in fields)
循环中的这一行,在yield
:
print name.ljust(20) + " ".join(str(getattr(car, f)).ljust(10) for f in fields)
str.ljust(n)
是一个标准字符串函数,它返回在n
个字符的总宽度内向左对齐的字符串。对齐右对齐和居中对齐有类似的功能:rjust
和center
。由于您的汽车似乎是某些类的实例,您可以使用内置函数getattr(<object>, <attribute name>)
来检索汽车的各个属性(类似于您的getVariable
方法)。
有关字符串格式设置的更多信息,请查看此Python documentation page。
答案 1 :(得分:0)
试试这个:
#print your header labels first
d = {'power': 55, 'ident': 'meA160', 'model': 'A160 CDI', 'disp': 1.7, 'make': 'mercedes', 'luxury': 'N'}
# this is for each car
headers = ['ident', 'make', 'model', 'disp', 'power', 'luxury'] # change this order if you want different order
values = [d[h] for h in headers]
print("{0:12}{1:12}{2:12}{3:12}{4:12}{5:12}".format(values[0], values[1], values[2], values[3], values[4], values[5]))
答案 2 :(得分:0)
尝试以下操作...我使用词典对其进行了测试,因此我访问了car_object[obj][key.lower()]
所拥有的属性。我不能不看你的汽车课,但你应该用car_obj[obj].__getattribute__(key.lower())
car_object = {}
car_object['Car_Object_meA160'] = {'power': 55, 'ident': 'meA160', 'model': 'A160 CDI', 'disp': 1.7, 'make': 'mercedes', 'luxury': 'N'}
car_object['Car_Object_meA190'] = {'power': 92, 'ident': 'meA190', 'model': 'A190', 'disp': 1.7, 'make': 'mercedes', 'luxury': 'Y'}
car_object['Car_Object_meA210'] = {'power': 103, 'ident': 'meA210', 'model': 'A210 EVO', 'disp': 1.7, 'make': 'mercedes', 'luxury': 'Y'}
keys = ['IDENT', 'MAKE', 'MODEL', 'DISP', 'POWER', 'LUXURY']
fmt ='{:>10}' * (len(keys) + 1)
print ' '*len('Car_Object_meA160'), fmt.format('', *keys)
for obj in car_object:
print obj, fmt.format('', *([car_object[obj][key.lower()] for key in keys]))
答案 3 :(得分:-1)
是。这是一个快速的功能,它可以列出并打印出你想要的内容。
def output(cars):
print " IDENT MAKE MODEL DISP POWER"
for i in cars:
print type(i)," ",i[ident]," ",i[make]," ",i[model]," ",i[disp]," ",i[power]
它应该打印出你放的那么多车。虽然我对间距不是很肯定。