在 Python 中转置数字表格

4
我需要用Python编写以下数据:
student score
Bill         43
Suzy       54
Sally       41

但我也需要将其翻转,使其看起来像

student Bill Suzy Sally
score    43   54    41

我已经写好了这个内容,

ofile = open('grades','r')
Tfile = open('Tgrades','u')
date = []
while 1:
  a = ofile.readline()
  if a=='':
   break
  data.append(a.split())

2
我脑海中正在形成的解决方案大量使用了zip内置函数。你知道它吗?如果不知道,可以去了解一下。它非常有用。 - mgilson
3个回答

6
with open ('yourfile') as fin:
   lines = (line.split() for line in fin)
   for row in zip(*lines):
       print ' '.join(row)

3

Jon Clements的答案展示了如何在获取数据后进行转置。

你可能还想考虑使用csv模块来首先读取数据,而且你一定要关闭文件。

import csv
with open('grades') as fin:
    rows = csv.reader(fin, delimiter=' ', skipinitialspace=True)
    transposed = zip(*rows)
    with open('tgrades', 'w') as fout:
        w = csv.writer(fout, delimiter='\t')
        w.writerows(transposed)

一旦您了解每行代码的作用,就可以将其变得更加简洁:

import csv
with open('grades') as fin, open('tgrades', 'w') as fout:
    rows = csv.reader(fin, delimiter=' ', skipinitialspace=True)
    csv.writer(fout, delimiter='\t').writerows(zip(*rows))

需要翻译的内容:

需要注意的一点是,你不会轻易地得到良好的间距。即使你没有放弃对齐原始情况下的所有间距,也没有帮助,因为它是错误的数量。我通过使用制表符而不是空格来解决这个问题,在这种情况下它起作用(只要您在具有8个字符制表符的编辑器中查看它),因为所有的值和标题都小于7个字符…但通常情况下,这个技巧是行不通的。所以,如果你实际想要的是一个可读性好且格式漂亮的人类可读表格,而不是可读性好与机器可读性之间的完美折中(这就是CSV所提供的),那么这并不是全部的答案。



很不幸,我必须保持我的回答简短 - 因为在手机上打字太可怕了。+1 给你通常详细的回答。 - Jon Clements
@JonClements:哇,你居然用手机回答SO的问题?还贴代码?我无法想象自己这样做,更别提像你那样给出有用的答案了! - abarnert
是的 - 这是一种受虐狂、愚蠢或沉重的SO(Stack Overflow)成瘾的迹象。这些都不是好的特征... :'( - Jon Clements

1
>>> student =('Billy','Suzy','Sally')
>>> score=(43,54,41)
>>> (student,score)
(('Billy', 'Suzy', 'Sally'), (43, 54, 41))

>>> flipped = zip(*(student,score))
>>> flipped
[('Billy', 43), ('Suzy', 54), ('Sally', 41)]

>>> zip(*flipped)
[('Billy', 'Suzy', 'Sally'), (43, 54, 41)]

你可以使用zip(*matrix)来转置矩阵。

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