我对Python很陌生,我现在正在努力为打印输出格式化我的数据。

我有一个用于两个标题的列表,以及一个应该是表的内容的矩阵。像这样:

teams_list = ["Man Utd", "Man City", "T Hotspur"]
data = np.array([[1, 2, 1],
                 [0, 1, 0],
                 [2, 4, 2]])

注意,标题名称的长度不一定相同。但是,数据项都是整数。

现在,我想用表格的形式来表示,就像这样:

            Man Utd   Man City   T Hotspur
  Man Utd         1          0           0
 Man City         1          1           0
T Hotspur         0          1           2

我有一种预感,这一定有一个数据结构,但我找不到它。我尝试过使用字典和格式化打印,我尝试过使用缩进的for循环,我尝试过打印字符串。

我相信一定有一个非常简单的方法来做到这一点,但我可能因为缺乏经验而错过了它。


当前回答

list1 = [1, 2, 3]
list2 = [10, 20, 30]

l = []

for i in range(0, len(list1)):
    l.append(list1[i]), l.append(list2[i])

# print(l)

for i in range(0, len(l), 2):
    print(l[i], "", l[i + 1])

其他回答

我知道我迟到了,但我刚刚为这个做了一个库,我认为它真的很有帮助。它非常简单,这就是为什么我认为你应该使用它。它叫做TableIT。

基本的使用

要使用它,首先要遵循GitHub页面上的下载说明。

然后导入:

import TableIt

然后创建一个列表的列表,其中每个内列表都是一行:

table = [
    [4, 3, "Hi"],
    [2, 1, 808890312093],
    [5, "Hi", "Bye"]
]

然后你要做的就是打印它:

TableIt.printTable(table)

这是你得到的输出:

+--------------------------------------------+
| 4            | 3            | Hi           |
| 2            | 1            | 808890312093 |
| 5            | Hi           | Bye          |
+--------------------------------------------+

字段名称

如果你愿意,你可以使用字段名(如果你不使用字段名,你不必说useFieldNames=False,因为它是默认设置的):


TableIt.printTable(table, useFieldNames=True)

从中你会得到:

+--------------------------------------------+
| 4            | 3            | Hi           |
+--------------+--------------+--------------+
| 2            | 1            | 808890312093 |
| 5            | Hi           | Bye          |
+--------------------------------------------+

还有其他用途,比如你可以这样做:

import TableIt

myList = [
    ["Name", "Email"],
    ["Richard", "richard@fakeemail.com"],
    ["Tasha", "tash@fakeemail.com"]
]

TableIt.print(myList, useFieldNames=True)

来自:

+-----------------------------------------------+
| Name                  | Email                 |
+-----------------------+-----------------------+
| Richard               | richard@fakeemail.com |
| Tasha                 | tash@fakeemail.com    |
+-----------------------------------------------+

或者你可以这样做:

import TableIt

myList = [
    ["", "a", "b"],
    ["x", "a + x", "a + b"],
    ["z", "a + z", "z + b"]
]

TableIt.printTable(myList, useFieldNames=True)

从中你可以得到:

+-----------------------+
|       | a     | b     |
+-------+-------+-------+
| x     | a + x | a + b |
| z     | a + z | z + b |
+-----------------------+

颜色

你也可以使用颜色。

您可以使用color选项(默认设置为None)并指定RGB值来使用颜色。

使用上面的例子:

import TableIt

myList = [
    ["", "a", "b"],
    ["x", "a + x", "a + b"],
    ["z", "a + z", "z + b"]
]

TableIt.printTable(myList, useFieldNames=True, color=(26, 156, 171))

那么你会得到:

请注意,打印颜色可能不适合你,但它的工作原理与其他打印彩色文本的库完全相同。我已经测试过了,每一种颜色都可以。如果使用默认的34m ANSI转义序列,蓝色也不会被打乱(如果你不知道那是什么,没关系)。不管怎样,这都是因为每个颜色都是RGB值,而不是系统默认值。

更多信息

欲了解更多信息,请查看GitHub页面

Python实际上让这变得非常简单。

类似的

for i in range(10):
    print '%-12i%-12i' % (10 ** i, 20 ** i)

会有输出

1           1           
10          20          
100         400         
1000        8000        
10000       160000      
100000      3200000     
1000000     64000000    
10000000    1280000000  
100000000   25600000000
1000000000  512000000000

字符串中的%本质上是一个转义字符,它后面的字符告诉python数据应该是什么样的格式。字符串外部和后面的%告诉python您打算使用前面的字符串作为格式字符串,并且下面的数据应该放入指定的格式中。

在本例中,我使用了两次“%-12i”。分解每一部分:

'-' (left align)
'12' (how much space to be given to this part of the output)
'i' (we are printing an integer)

来自文档:https://docs.python.org/2/library/stdtypes.html#string-formatting

我发现这只是为了寻找一种输出简单列的方法。如果你只是需要简单的列,那么你可以使用这个:

print("Titlex\tTitley\tTitlez")
for x, y, z in data:
    print(x, "\t", y, "\t", z)

编辑:我试图尽可能简单,因此手动做了一些事情,而不是使用团队列表。概括一下OP的实际问题:

#Column headers
print("", end="\t")
for team in teams_list:
    print(" ", team, end="")
print()
# rows
for team, row in enumerate(data):
    teamlabel = teams_list[team]
    while len(teamlabel) < 9:
        teamlabel = " " + teamlabel
    print(teamlabel, end="\t")
    for entry in row:
        print(entry, end="\t")
    print()

Ouputs:

          Man Utd  Man City  T Hotspur
  Man Utd       1       2       1   
 Man City       0       1       0   
T Hotspur       2       4       2   

但这似乎不再比其他答案简单,好处可能是它不需要更多的进口。但是@campkeith的答案已经满足了这一点,并且更加健壮,因为它可以处理更广泛的标签长度。

对于简单的情况,你可以使用现代字符串格式(简化的Sven的答案): f ' {column1_value: 15} {column2_value}’:

table = {
    'Amplitude': [round(amplitude, 3), 'm³/h'],
    'MAE': [round(mae, 2), 'm³/h'],
    'MAPE': [round(mape, 2), '%'],
}

for metric, value in table.items():
    print(f'{metric:14} : {value[0]:>6.3f} {value[1]}')

输出:

Amplitude      :  1.438 m³/h
MAE            :  0.171 m³/h
MAPE           : 27.740 %

来源:https://docs.python.org/3/tutorial/inputoutput.html formatted-string-literals

一些特别的代码:

row_format ="{:>15}" * (len(teams_list) + 1)
print(row_format.format("", *teams_list))
for team, row in zip(teams_list, data):
    print(row_format.format(team, *row))

这依赖于str.format()和格式规范迷你语言。