Я пишу скрипт, который добавляет пробелы к элементам в столбце и вычисляет эти пробелы, вычитая длину элемента из максимальной длины всех элементов в столбце.
Я собрал некоторые данные испытаний, которые представляют собой двухмерный список.
Я работал над этим уже несколько дней и добился прогресса. Теперь у меня возникают проблемы с добавлением слишком много пробелов для каждого элемента.
Моя идея состоит в том, чтобы создать массив длин каждого элемента, список максимальных длин в каждом столбце и массив необходимых пространств, затем добавить значение в массив пространств, необходимых для элемента, кроме для элемента с максимальной длиной в столбце.
Я не могу использовать numpy
или pandas
, поэтому я был вынужден создать утилиту табулирования, используя только встроенные модули.
Пожалуйста, помогите мне понять, в чем дело, и дайте мне знать, если есть более эффективный и простой способ сделать это.
Вот мой код:
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 ']]
Спасибо за ваше время и помощь.