2011-03-26 17 views
-1

我有例如不同類型的數據:Python的分類表

4.5,3.5,U1 
4.5,10.5,U2 
4.5,6,U1 
3.5,10.5,U2 
3.5,10.5,U2 
5,7,U1 
7,6.5,U1 

我需要輸出:

'U1': [['4.5', '3.5'], ['4.5', '6'], ['5', '7'], ['7', '6.5']] 
'U2': [['4.5', '10.5'], ['3.5', '10.5'], ['3.5', '10.5']] 

所以我的代碼是:

import csv 

reader = csv.reader(open('test.data', 'r')) 
result = {} 
for row in reader: 
    uclass=row[-1] 
    if result.has_key(uclass): 
     result[uclass].append([row[0],row[1]])  #--->how can I change from 0 to -2 row ?? 
    else: 
     result[uclass]=[[row[0],row[1]]]    #--->-->how can I change from 0 to -2 row ?? 
print repr(result) 

但我需要這個代碼對於任何其他輸入數據,有很多行,而不僅僅是3!

回答

2
result[uclass].append(row[:-1]) 

result[uclass] = row[:-1] 

這個符號被稱爲slicing代碼

見註釋。

2

這也許?

data = """\ 
4.5,3.5,U1 
4.5,10.5,U2 
4.5,6,U1 
3.5,10.5,U2 
3.5,10.5,U2 
5,7,U1 
7,6.5,U1""".splitlines() 

from collections import defaultdict 
dd = defaultdict(list) 
for d in data: 
    dl = d.split(',') 
    dd[dl[-1]].append(list(map(float, dl[:-1]))) 

for key in dd: 
    print key, dd[key] 

打印:

U1 [[4.5, 3.5], [4.5, 6.0], [5.0, 7.0], [7.0, 6.5]] 
U2 [[4.5, 10.5], [3.5, 10.5], [3.5, 10.5]] 
0

這裏是你的代碼,我做了改變一點點。

import csv 
reader = csv.reader(open('test.data', 'r')) 
result = {} 
for row in reader: 
    #print row 
    if(len(row) == 0): 
    continue; 
    uclass = row[-1] 
    if result.has_key(uclass): 
    result[uclass].append([row[:-1]])  #--->how can I change from 0 to -2 row ?? 
    else: 
    result[uclass]=[[row[:-1]]]    #--->-->how can I change from 0 to -2 row ?? 
print repr(result) 

我測試了以下數據,它的工作原理。

5.66,4.5,3.5,U1 
4.5,23123,34,10.5,U2 
4.5,6,U1 
3.5,10.5,U2 
3.5,10.5,U2 
5,7,U1 
7,6.5,U1 
4.5,45,73.3,56,66,72.5,U3 
0
import csv 
import collections 

def main(): 
    with open('testdata.csv', 'rb') as inf: 
     incsv = csv.reader(inf) 
     res = collections.defaultdict(list) 
     for row in incsv: 
      key = row.pop() 
      res[key].append([float(r) for r in row]) 

    for key,val in res.iteritems(): 
     print("{0}: {1}".format(key, val)) 

if __name__=="__main__": 
    main() 

結果

U1: [[4.5, 3.5], [4.5, 6.0], [5.0, 7.0], [7.0, 6.5]] 
U2: [[4.5, 10.5], [3.5, 10.5], [3.5, 10.5]] 

評論:

  1. csv.reader預計二進制文件 - 使用 'RB' 作爲閱讀模式

  2. 切片列表創建列表的新副本;流行不,因此在時間和記憶上更有效率。