Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:根据列中的最大长度向行中的元素添加空格时出现问题_Python_Multidimensional Array_Tabs_Spaces - Fatal编程技术网

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

Python:根据列中的最大长度向行中的元素添加空格时出现问题,python,multidimensional-array,tabs,spaces,Python,Multidimensional Array,Tabs,Spaces,我正在编写一个脚本,向列中的项目添加空格,并通过从列中所有项目的最大长度中减去项目的长度来计算这些空格 我把一些测试数据汇总在一起,这是一个二维列表 我已经在这方面工作了几天,并且取得了进展。现在,我遇到了为每个项目添加太多空格的问题 我的想法是创建一个包含每个项目长度的数组、一个列中最大长度的列表和一个所需空格的数组,然后将所需空格数组中的值添加到项目中,但列中长度最大的项目除外 我无法使用numpy或pandas,因此我被迫只使用内置工具构建一个制表实用程序 请帮我看看哪里出了问题,并让我知

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

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

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

我的想法是创建一个包含每个项目长度的数组、一个列中最大长度的列表和一个所需空格的数组,然后将所需空格数组中的值添加到项目中,但列中长度最大的项目除外

我无法使用
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                                        ']]

感谢您的时间和帮助。

请您帮助我理解
fmt=column_sep.join({{!s:{}}}})。最大宽度中w的格式(w)
?它是有效的,只是想更好地理解它。@Debug255:当然。首先,让我们看看我们正在创建的一个格式字符串:
{!s:10}
。如果我们使用
{!s:10}.format(None)
,则花括号表示字符串在那里被格式化<代码>!s表示格式为字符串。
:10
表示在10个字符宽的字段中左对齐。现在在
'{{!s:{}}'.format(w)
中,我正在创建类似
'{!s:10}'
的格式字符串。为了在输出中获得花括号,我必须将它们加倍,以便
.format()
忽略它们。所有这些都封装在一个生成器表达式中,该表达式在
max_widths
上迭代,因此我们得到了每个宽度的格式字符串。
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))