编写一个Python3过程来列出一个表

编写一个Python3过程来列出一个表,python,Python,我正在尝试编写一个Python3过程来列出一个表 以下代码起作用: row_names = ['2010', '2011', '2012', '2013', '2014'] row_names = ['2010', '2011', '2012', '2013', '2014'] Q1 = [92186686.0, 105377495.0, 105614831.0, 132754996.0, 148215172.0] Q2 = [104962317.0, 110508367.0, 12818633

我正在尝试编写一个Python3过程来列出一个表

以下代码起作用:

row_names = ['2010', '2011', '2012', '2013', '2014']
row_names = ['2010', '2011', '2012', '2013', '2014']
Q1 = [92186686.0, 105377495.0, 105614831.0, 132754996.0, 148215172.0]
Q2 = [104962317.0, 110508367.0, 128186331.0, 155886320.0, 183020484.0]
Q3 = [112246699.0, 106483616.0, 141499253.0, 162577034.0, 209049734.0]
Q4 = [110142209.0, 104711167.0, 131444819.0, 145805847.0, 222521075.0]

column_data = [Q1, Q2, Q3, Q4]

column_names = ['Years', "Q1", 'Q2', 'Q3', 'Q4'] 

data = [column_names] + list(zip(row_names, Q1, Q2, Q3, Q4))
for i, d in enumerate(data):
    line = ' '.join(str(x).ljust(16) for x in d)
    print(line)
    if i == 0:
        print('-' * len(line))
但当我将其更改为具有以下代码的函数时:

def table(row_names, column_names, column_data):
    data = [column_names] + list(zip(row_names, column_data))
    #data = [titles] + list(zip(years, column_data))
    for i, d in enumerate(data):
        line = ' '.join(str(x).ljust(16) for x in d)
        print(line)
        if i == 0:
            print('-' * len(line))
    return

列数据是水平列出的,而不是垂直列出的。请帮助我了解哪里出了问题。提前感谢。

正如@D.LaRocque在评论中指出的,问题可能在于这一行:

data = [column_names] + list(zip(row_names, column_data))
您需要将其更改为:

data = [column_names] + list(zip(row_names, *column_data))
zip()
函数的作用取决于给定的参数数量。请记住,
列_data
是一个列表列表-
[Q1、Q2、Q3、Q4]
。默认情况下,
zip()
将获取该外部列表并将其压缩到
行名称
,这样
行名称[0]
对应于
Q1
行名称[1]
对应于
Q2
,等等


相反,您希望
行名称[0]
Q1[0]
Q2[0]
等相对应。为此,您需要将它们作为单独的参数传递给
zip()
函数。这就是上面的
*
操作符所做的-它将列表
[Q1,Q2,Q3,Q4]
解压为位置参数
Q1,Q2,Q3,Q4

您更改了对
zip
的调用方式,从包含5个列表(即
行名称
Q1
Q2
Q3
Q4
)的zip改为两个列表(
行名称
列数据

由于
column\u data
是一个包含
Q1
Q2
Q3
Q4
的列表,我们希望将
column\u data
解包,以便
zip
将其视为4个不同的列表

为了做到这一点,我们使用星号操作符

a,b,c=*[a,b,c]
因此,校正后的功能如下

def表(行名称、列名称、列数据):
数据=[列名称]+列表(zip(行名称,*列数据))
#数据=[标题]+列表(zip(年份,列数据))
对于枚举中的i,d(数据):
line=''.join(str(x).ljust(16)表示d中的x)
打印(行)
如果i==0:
打印('-'*len(行))
返回

如何调用此函数?请尝试
data=[column\u names]+list(zip(row\u names,*coloum\u data))
如果唯一更改的是
zip
内容所在的行,我猜您调用此函数的方式可能不同,或者
zip
的行为与您现在正在压缩2个列表而不是5个列表的预期有所不同是的,@D.LaRocque说了什么……但我想让您了解可能发生了什么变化的思维过程您考虑过使用Pandas库处理表格数据吗?