2016-04-06 119 views
2

讓說我有一個表在蟒蛇的格式如下:轉換數據表格式

id1 V1 100 
id1 V2 200 
id1 V3 0 
id2 V1 300 
id2 V2 400 
id2 V3 1 

,我想在轉換爲這種格式:

id1 100 200 0 
id2 300 400 1 

V1,V2和V3是可變名稱,我不需要保留它們。我只需要ids和每個變量的值。變量數(Vs)也是未知的,但變量的順序總是相同的。我正在尋找一種更智能的方式來轉換而不是循環。有沒有內置功能?

+0

任何內建將使用循環。沒有? – Signal

回答

3

沒有其他的內置方法,但你可以使用字典組:

from collections import defaultdict 

d = defaultdict(list) 

s = """id1 V1 100 
id1 V2 200 
id1 V3 0 
id2 V1 30 
id2 V2 400 
id2 V3 1""" 

for a, _, c in map(str.split, s.splitlines()): 
     d[a].append(c) 

print(["{},{}".format(k,",".join(v)) for k,v in d.items()] 
['id2,30,400,1', 'id1,100,200,0'] 

如果你想輸出很好地對齊,你可以這樣做this如果你想維持秩序

,使用OrderedDict:

from collections import OrderedDict 

d = OrderedDict() 

s = """id1 V1 100 
id1 V2 200 
id1 V3 0 
id2 V1 30 
id2 V2 400 
id2 V3 1""" 

for a, _, c in map(str.split, s.splitlines()): 
     d.setdefault(a, []).append(c) 

如果是在一個文件,你可以用CSV LIB解析它:

import csv 
from collections import OrderedDict 
d = OrderedDict() 

with open("in.txt") as f: 
    for k, _, v in csv.reader(f, delimiter=" "): 
     d.setdefault(k, []).append(v) 

的OrderedDict輸出:

OrderedDict([('id1', ['100', '200', '0']), ('id2', ['30', '400', '1'])])