将列表的列表转换为表格

6

我有一个嵌套列表:

tableData = [['apples', 'oranges', 'cherries', 'banana'],
             ['Alice', 'Bob', 'Carol', 'David'],
             ['dogs', 'cats', 'moose', 'goose']]

我需要将这个转换成表格:

apples      Alice    dogs
oranges       Bob    cats 
cherries    Carol    moose 
banana      David    goose

对我来说,关键是将“行”转换为列(即苹果、橙子、樱桃、香蕉在同一列下)。

我尝试过不同的选项(A):

for row in tableData:
        output = [row[0].ljust(20)]
            for col in row[1:]:
             output.append(col.rjust(10))
            print(' '.join(output))

选项(B):

方法2

提示:本文涉及IT技术相关内容。
for i in tableData:
    print( i[0].ljust(10)+(str(i[1].ljust(15)))+(str(i[2].ljust(15)))+
    (str(i[3].ljust(15))))    

似乎没有人解决这个问题。
提前感谢任何建议。


请明确一下,这是Py2还是Py3?print在两者之间有所不同,而您的示例代码使用它的方式并没有展示出任何差异来澄清这一点。 - ShadowRanger
这是Python 3.5。 - AT_1965
4个回答

8
使用zip-and-splat技巧来转置表格。
要左右对齐单元格,请使用格式规范语言
>>> for row in zip(*tableData):
...     print '{:<10}{:>7}    {:<10}'.format(*row)
...     
apples      Alice    dogs      
oranges       Bob    cats      
cherries    Carol    moose     
banana      David    goose   

最后一个条目不需要显式的字段宽度,因为它是左对齐的,如果超过宽度就会溢出。除此之外,是的,这是最佳答案。 - ShadowRanger
谢谢。这些#号到底代表什么? - AT_1965
1
你有跟随链接吗?这些数字是为内容保留的空间,以便左对齐或右对齐知道需要在左侧或右侧添加多少个空格。 - Matthias

2

您也可以尝试使用 pandas.DataFrame 进行操作:

In [22]: import pandas as pd
In [22]: pd.DataFrame(tableData).T # .T means transpose the dataframe
Out[22]:
          0      1      2
0    apples  Alice   dogs
1   oranges    Bob   cats
2  cherries  Carol  moose
3    banana  David  goose

通过将列和索引设置为空白,可以去除那些令人烦恼的数字:

In [27]: l1, l2 = len(tableData), len(tableData[0])

In [28]: pd.DataFrame(tableData, index=['']*l1, columns=['']*l2).T
Out[28]:

    apples  Alice   dogs
   oranges    Bob   cats
  cherries  Carol  moose
    banana  David  goose

1
不是要打贬义评价,但我认为在解决一个简单的问题时使用pandas可能有点过头了。 :-) - ShadowRanger
@ShadowRanger 我确实考虑过这个问题,但是仔细想想,我认为这是一个值得提供给提问者考虑的工具(即使现在不需要,在将来也可能有用) :) - Moses Koledoye

1

将嵌套列表“翻转”的最简单方法是使用 zip

for fruit, name, animal in zip(*tableData):
    print(fruit.ljust(10), name.ljust(10), animal.ljust(10))

这将打印:

apples     Alice      dogs
oranges    Bob        cats
cherries   Carol      moose
banana     David      goose

惊人的!!!谢谢 - AT_1965

0

这个已经有内置函数了:zip

zip(* [['apples', 'oranges', 'cherries', 'banana'],
       ['Alice', 'Bob', 'Carol', 'David'],
       ['dogs', 'cats', 'moose', 'goose']])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接