2014-09-13 78 views
-3

去除專欄中,我有一個數據集,我到Python元組讀取,它看起來像下面的一個,創建與特定的列值作爲關鍵的Python字典和值

name time dept id 
-------------------- 
b1 2:00pm z1 1 
b2 3:00pm z2 2 
c1 4:00pm y2 1 
b3 3:00pm z3 3 
c4 4:00pm x2 2 

我想根據id值將數據分成塊。它應該是一個塊,其ID列中所有的元組值爲1,另一個塊值爲2,依此類推。我在想的是創建一個ID爲字典的字典作爲我的鍵,我可以創建一個字典,但這裏的小故障是從字典中的值中刪除ID列。因爲元組是不可變的,所以我不能刪除id列的值,同時我需要該列的值來保存它作爲我的字典中的一個鍵。 我正在尋找一個優化版本,因爲我的代碼必須處理數百萬個元組。請建議。

+0

我不知道你想要什麼,究竟。是這樣的嗎? '1':[('b1','2:00 pm','z1'),('c1','4:00 pm','y2')], '2':[( 'b2','3:00 pm','z2'),('c4','4:00 pm','x2')], '3':[('b3','3:00 pm',' z3')] }' – 2014-09-13 09:29:09

+0

是的。與此類似。因爲我想輸入每個塊到我的算法進行並行處理。算法根據每個塊中的關鍵字區分塊。 – 2014-09-13 09:36:23

+0

請從問題中刪除您的字典示例。它真的讓人神經緊張,因爲它是完全不好的語法。我的蟒蛇眼睛不能忍受它:) – Mejmo 2014-09-13 09:50:09

回答

1

只是要在文件的字典,沒有一點投入的元組後來從tuples做出dict

d = {} 
with open("in.txt") as f: 
    f.next(),f.next() # skip headers 
    for line in f: 
     name, time, dept, id = line.split() 
     d.setdefault(id,[]) 
     d[id].append((name,time,dept)) 
print d 

{'1': [('b1', '2:00pm', 'z1'), ('c1', '4:00pm', 'y2')], '3': [('b3', '3:00pm', 'z3')], '2': [('b2', '3:00pm', 'z2'), ('c4', '4:00pm', 'x2')]} 

如果ID總是最後一個元素:

d = {} 
with open("in.txt") as f: 
    f_csv = csv.reader(f, delimiter='\t') 
    headers = next(f_csv) 
    tuple_attr = tuple(headers) 
    data = tuple(tuple(x.split()) for x in f_csv) 
    for tup in data: 
     d.setdefault(tup[-1],[]) 
     d[tup[-1]].append(tup[:-1]) 

tup[-1]獲取密鑰的最後一個元素tup[:-1]獲取我們值的最後一個元素。

你可以只遍歷f_csv避免使元組乾脆:

d = {} 
with open("in.txt") as f: 
    f_csv = csv.reader(f, delimiter='\t') 
    headers = next(f_csv) 
    tuple_attr = tuple(headers) 
    for ele in f_csv: 
     d.setdefault(ele[-1],[]) 
     d[ele[-1]].append(ele[:-1]) 
+0

我無法對列名稱進行硬編碼,因爲它基於數據集更改。而加起來,我的列數根據數據集而不同。 – 2014-09-13 09:26:43

+0

我沒有硬編碼任何名稱,名稱是無關緊要的,我只是把這一行分成四部分。如果你的列數不同,你如何將它們放入元組中? – 2014-09-13 09:30:25

+0

我做他們這樣的..開放(文件名)爲f: f_csv = csv.reader(F,分隔符= '\ t') 標題=下一個(f_csv) tuple_attr =元組(頭) 數據=元組(tuple(x)for f in f_csv)我不能根據這些列名拆分行,因爲數據集每次都不相同。 – 2014-09-13 09:35:08