2013-04-29 6 views
3

мне нужно записать данные ниже в питоне,Транспонирование таблицы чисел в 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

ответ

2
with open ('yourfile') as fin: 
    lines = (line.split() for line in fin) 
    for row in zip(*lines): 
     print ' '.join(row) 
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)

3

Ответ Джона Клементса показывает, как перенести данные после его получения.

Возможно, вы также захотите рассмотреть возможность использования модуля 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), это не весь ответ.

+0

К сожалению, мне пришлось оставить свой ответ коротким - как печатать на телефоне ужасно. +1 для вашего обычного подробного ответа –

+0

@JonClements: Ого, вы на самом деле отвечаете на вопросы SO на телефоне? С кодом? Я даже представить себе не могу, даже пытаясь сделать это, тем более давая полезный ответ, как ваш! – abarnert

+0

Да - признак мазохизма, глупости или тяжелой наркомании. Ни одна из них не обладает хорошими характеристиками ...: '( –

Смежные вопросы