这是产生输出的最pythonic方式.让我举例说明我正在努力实现的行为.
对于我的项目,我正在构建一个函数,该函数使用不同的参数来打印列中的输出.
它收到的列表示例.
[('Field', 'Integer', 'Hex'),
('Machine;', 332, '0x14c'),
('NumberOfSections;', 9, '0x9'),
('Time Date Stamp;', 4, '0x4'),
('PointerToSymbolTable;', 126976, '0x1f000')
**项目的大小可以不同(现在每个元组只有3个项目,另一个列表可以是4个或任何数字**
输出应该是这样的
Field Integer Hex
-------------------------------------------------------------------------------
Machine; 332 0x14c
NumberOfSections; 9 0x9
Time Date Stamp; 4 0x4
PointerToSymbolTable; 126976 0x1f000
出于工作目的,我创建了一个仅包含标题字段的列表:
这不是必要的,但它使尝试的东西更容易一些
Header field is ['Field', 'Integer', 'Hex']
列表中的第一个元组声明了所谓的“标题字段”,如列表示例所示.
对于这种情况,只有3个项目,但这可能会不时有所不同.所以我尝试用以下方法计算物品的大小:
length_container_header = len(container[0])
此变量可用于正确构建输出.
构建标题“print”我会构建这样的东西.
print("{:21} {:7} {:7}".format(header_field[0], header_field[1], header_field[2]))
现在这是一个关于应该如何的手动版本.正如您所注意到的那样,标题字段“Field”更短
列表中的PointerToSymbolTable.我写了这个函数来确定列表中每个位置的最长项
container_lenght_list = []
local_l = 0
for field in range(0, lenght_container_body):
for item in container[1:]:
if len(str(item[field])) > local_l:
local_l = len(str(item[field]))
else:
continue
container_lenght_list.append(str(local_l))
local_l = 0
在这种情况下,像[21,7,7]一样生成一个列表.
创建格式字符串可以非常简单,
formatstring = ""
for line in lst:
formatstring+= "{:" + str(line) +"}"
哪个产生字符串:
{:21}{:7}{:7}
这部分是遇到麻烦的,我怎样才能生成格式字符串的最后一部分?
我在format()函数中尝试了一个嵌套的for循环,但我最终得到了各种错误.我认为可以用一个
对于循环,我只是无法弄清楚如何.如果有人能让我朝着正确的方向推进我的标题打印,我将非常感激.一旦我弄清楚如何打印标题,我几乎可以弄清楚其余部分.我希望我解释得很好
亲切的问候,
解决方法:
container = [
('Field', 'Integer', 'Hex'),
('Machine;', 332, '0x14c'),
('NumberOfSections;', 9, '0x9'),
('Time Date Stamp;', 4, '0x4'),
('PointerToSymbolTable;', 126976, '0x1f000')
]
lengths = [
max(len(str(row[i])) for row in container) for i in range(len(container[0]))
] # => [21, 7, 7]
# OR lengths = [max(map(len, map(str, x))) for x in zip(*container)]
fmt = ' '.join('{:
# => '{:<21} {:<7} {:<7}' # < for left-align
print(fmt.format(*container[0])) # header
print('-' * (sum(lengths) + len(lengths) - 1)) # separator
for row in container[1:]:
print(fmt.format(*row)) #
# similar to print(fmt.format(row[0], row[1], row[2])
输出:
Field Integer Hex
-------------------------------------
Machine; 332 0x14c
NumberOfSections; 9 0x9
Time Date Stamp; 4 0x4
PointerToSymbolTable; 126976 0x1f000
标签:python,format,string,list