在python中转置一个数字表

时间:2013-04-29 19:17:51

标签: python transpose

我需要在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())

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分: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),这不是完整的答案。

答案 2 :(得分:0)

>>> 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)

转置矩阵