Python: проблема с добавлением пробелов к элементам в строке на основе максимальной длины в столбце - PullRequest
0 голосов
/ 30 августа 2018

Я пишу скрипт, который добавляет пробелы к элементам в столбце и вычисляет эти пробелы, вычитая длину элемента из максимальной длины всех элементов в столбце.

Я собрал некоторые данные испытаний, которые представляют собой двухмерный список.

Я работал над этим уже несколько дней и добился прогресса. Теперь у меня возникают проблемы с добавлением слишком много пробелов для каждого элемента.

Моя идея состоит в том, чтобы создать массив длин каждого элемента, список максимальных длин в каждом столбце и массив необходимых пространств, затем добавить значение в массив пространств, необходимых для элемента, кроме для элемента с максимальной длиной в столбце.

Я не могу использовать 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                                        ']]

Спасибо за ваше время и помощь.

1 Ответ

0 голосов
/ 31 августа 2018
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))
...