Python:根据列中的最大长度向行中的元素添加空格时遇到问题



我正在编写一个脚本,该脚本为列中的项目添加空格,并通过从列中所有项目的最大长度中减去项目的长度来计算这些空格。

我把一些测试数据放在一起,这是一个二维列表。

我已经为此工作了几天,并取得了进展。现在,我遇到了为每个项目添加太多空格的问题。

我的想法是创建一个每个项目的长度数组,每列中最大长度的列表以及所需空格的数组,然后将所需空格数组中的值添加到项目,除了列中长度最大的项目。

我不能使用numpypandas,所以我被迫构建一个制表实用程序,仅使用内置。

请帮助我了解哪里出了问题,并让我知道是否有更有效和更简单的方法来完成此操作。

这是我的代码:

import datetime
from array import array
a_list = [['column1', 'column2', 'column3', 'column4', 'column5', 'column6', 'column7'],
['Blah', '0316497313', None, '14', None, datetime.timedelta(16495, 49560), datetime.datetime(2010, 2, 1, 0, 0)],
['Blah', '0316497313', None, '14', None, datetime.timedelta(16495, 49560), datetime.datetime(2016, 6, 13, 0, 0)],
['Blah', '0316497313', None, '14', None, datetime.timedelta(16495, 49560), datetime.datetime(2015, 6, 23, 0, 0)],
['Blah', '0316497313', None, '14', None, datetime.timedelta(16495, 49560), datetime.datetime(1998, 7, 20, 0, 0)],
['Blah', '0316497313', None, '14', None, datetime.timedelta(16495, 49560), datetime.datetime(2019, 7, 31, 0, 0)],
['Blah', '0316497313', None, '14', None, datetime.timedelta(16495, 49560), datetime.datetime(2016, 9, 12, 0, 0)],
['Blah', '0316497313', None, '14', None, datetime.timedelta(16495, 49560), datetime.datetime(2015, 5, 3, 0, 0)],
['Blah', '0316497313', None, '14', None, datetime.timedelta(16495, 49560), datetime.datetime(1998, 2, 16, 0, 0)],
['Blah', '0316497313', None, '14', None, datetime.timedelta(16495, 49560), datetime.datetime(2017, 6, 23, 0, 0)],
['Blah', '0316497313', None, '14', None, datetime.timedelta(16495, 49560), datetime.datetime(2010, 7, 17, 0, 0)],
['Blah', '0316497313', None, '13', None, datetime.timedelta(16495, 49560), datetime.datetime(1998, 4, 17, 0, 0)],]
columns = a_list[0]
# print(columns)
#print(a_list[:][0])
rows = a_list[1:]
#print(rows)
column_count = len(a_list[:][0])
# print(column_count)
space = r' '
tab = space*4
# Note 'H' is signed short int
lengths = [array('H', []), array('H', []), array('H', []), array('H', []), array('H', []), array('H', []), array('H', [])]
max_length = array('H', [0, 0, 0, 0, 0, 0, 0])
max_values = []
spaces_needed = [array('H', []), array('H', []), array('H', []), array('H', []), array('H', []), array('H', []), array('H', [])]
print('na_list before:n{}n'.format([row for row in a_list]))
# setup columns based on column_count
count = 1
for col in range(column_count):
indexer = 0
for row in a_list:
try:
lengths[col].append(len(row[col]))
except TypeError as type_error:
#print(type_error)
# if cannot get len() of NoneType, use length
# of column name less 1
lengths[col].append(len(columns[col])-1)
indexer += 1
# get max string length in columns
max_length[col] = max(lengths[col])
# print('max_length: {}'.format(max_length))
# calculate spaces needed and append to spaces_needed list
indexer = 0
for item in lengths[col]:
spaces_needed[col].append(abs(max_length[col] - item))
indexer += 1
print('lengths Column {}t{}'.format(count, lengths[col]))
count += 1
count = 1
for col in range(column_count):
indexer = 0
for row in a_list:
# print('iteration: {}tRow: {}'.format(indexer, row))
sub_indexer = 0
for i in row:
loc = row.index(i)
i = str(i)
# get max length values and add to its own list
if len(i) in max_length:
#=print('{} {} {}'.format(i, len(i), True))
max_values.append(i)
i += tab
row[loc] = i
sub_indexer += 1
continue
#print('{} {}'.format(i, type(i)))
i += space * spaces_needed[col][indexer] + tab
row[loc] = i
sub_indexer += 1
indexer += 1
count += 1
# remove duplicates in list
max_values = list(set(max_values))
print('nmax_values:t{}n'.format(max_values))
print('spaces_needed:n{}'.format(spaces_needed))
print('na_list after:n{}n'.format([row for row in a_list]))

以下是我所做的输出,以帮助您了解正在发生的事情:

a_list before:
[['column1', 'column2', 'column3', 'column4', 'column5', 'column6', 'column7'], ['Blah', '0316497313', None, '14', None, datetime.timedelta(16495, 49560), datetime.datetime(2010, 2, 1, 0, 0)], ['Blah', '0316497313', None, '14', None, datetime.timedelta(16495, 49560), datetime.datetime(2016, 6, 13, 0, 0)], ['Blah', '0316497313', None, '14', None, datetime.timedelta(16495, 49560), datetime.datetime(2015, 6, 23, 0, 0)], ['Blah', '0316497313', None, '14', None, datetime.timedelta(16495, 49560), datetime.datetime(1998, 7, 20, 0, 0)], ['Blah', '0316497313', None, '14', None, datetime.timedelta(16495, 49560), datetime.datetime(2019, 7, 31, 0, 0)], ['Blah', '0316497313', None, '14', None, datetime.timedelta(16495, 49560), datetime.datetime(2016, 9, 12, 0, 0)], ['Blah', '0316497313', None, '14', None, datetime.timedelta(16495, 49560), datetime.datetime(2015, 5, 3, 0, 0)], ['Blah', '0316497313', None, '14', None, datetime.timedelta(16495, 49560), datetime.datetime(1998, 2, 16, 0, 0)], ['Blah', '0316497313', None, '14', None, datetime.timedelta(16495, 49560), datetime.datetime(2017, 6, 23, 0, 0)], ['Blah', '0316497313', None, '14', None, datetime.timedelta(16495, 49560), datetime.datetime(2010, 7, 17, 0, 0)], ['Blah', '0316497313', None, '13', None, datetime.timedelta(16495, 49560), datetime.datetime(1998, 4, 17, 0, 0)]]
lengths Column 1    array('H', [7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4])
lengths Column 2    array('H', [7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10])
lengths Column 3    array('H', [7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6])
lengths Column 4    array('H', [7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
lengths Column 5    array('H', [7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6])
lengths Column 6    array('H', [7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6])
lengths Column 7    array('H', [7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6])
max_values: ['column2', 'column6', 'column7', 'column1', 'column3', 'column5', 'column4', '0316497313']
spaces_needed:
[array('H', [0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3]), array('H', [3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), array('H', [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]), array('H', [0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5]), array('H', [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]), array('H', [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]), array('H', [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])]
a_list after:
[['column1                               ', 'column2                               ', 'column3                               ', 'column4                               ', 'column5                               ', 'column6                               ', 'column7                               '], ['Blah                                        ', '0316497313                                     ', 'None                                        ', '14                                        ', 'None                                        ', '16495 days, 13:46:00                                        ', '2010-02-01 00:00:00                                        '], ['Blah                                        ', '0316497313                                     ', 'None                                        ', '14                                        ', 'None                                        ', '16495 days, 13:46:00                                        ', '2016-06-13 00:00:00                                        '], ['Blah                                        ', '0316497313                                     ', 'None                                        ', '14                                        ', 'None                                        ', '16495 days, 13:46:00                                        ', '2015-06-23 00:00:00                                        '], ['Blah                                        ', '0316497313                                     ', 'None                                        ', '14                                        ', 'None                                        ', '16495 days, 13:46:00                                        ', '1998-07-20 00:00:00                                        '], ['Blah                                        ', '0316497313                                     ', 'None                                        ', '14                                        ', 'None                                        ', '16495 days, 13:46:00                                        ', '2019-07-31 00:00:00                                        '], ['Blah                                        ', '0316497313                                     ', 'None                                        ', '14                                        ', 'None                                        ', '16495 days, 13:46:00                                        ', '2016-09-12 00:00:00                                        '], ['Blah                                        ', '0316497313                                     ', 'None                                        ', '14                                        ', 'None                                        ', '16495 days, 13:46:00                                        ', '2015-05-03 00:00:00                                        '], ['Blah                                        ', '0316497313                                     ', 'None                                        ', '14                                        ', 'None                                        ', '16495 days, 13:46:00                                        ', '1998-02-16 00:00:00                                        '], ['Blah                                        ', '0316497313                                     ', 'None                                        ', '14                                        ', 'None                                        ', '16495 days, 13:46:00                                        ', '2017-06-23 00:00:00                                        '], ['Blah                                        ', '0316497313                                     ', 'None                                        ', '14                                        ', 'None                                        ', '16495 days, 13:46:00                                        ', '2010-07-17 00:00:00                                        '], ['Blah                                        ', '0316497313                                     ', 'None                                        ', '13                                        ', 'None                                        ', '16495 days, 13:46:00                                        ', '1998-04-17 00:00:00                                        ']]

感谢您的时间和帮助。

rows = iter(a_list)
next(rows) # remove this line if you want to include headers
max_widths = [max(map(len, map(str, col)))  for  col in zip(*rows)]
# [4, 10, 4, 2, 4, 20, 19]
column_sep = '  ' # two spaces
fmt = column_sep.join('{{!s:{}}}'.format(w) for w in max_widths)
# '{!s:4}  {!s:10}  {!s:4}  {!s:2}  {!s:4}  {!s:20}  {!s:19}'
rows = iter(a_list)
next(rows)  # remove this line if you want to include headers
for row in rows:
print(fmt.format(*row))

最新更新