2017-03-02 58 views
0

我一直在尋找對我的問題的答案,但沒有成功。我有一個大名單的話,看起來像這樣一個CSV文件:根據第一列將第二列轉換爲行

a 1 
a 2 
a 3 
a 4 
b 5 
b 6 
b 7 
b 8 

我需要將其轉換爲這樣的:

a 1 2 3 4 
b 5 6 7 8 

沒有任何人有任何想法如何做到這一點?

回答

1

使用defaultdict來存儲與每個字母匹配的數字列表。

from collections import defaultdict 

dd = defaultdict(list) 

with open('input.csv') as f: 
    for line in f: 
     let, num = line.rstrip().split() 
     dd[let].append(num) 

with open('out.csv', 'w') as fo: 
    for k, v in dd.items(): 
     fo.write('%s %s\n' % (k, ' '.join(v))) 

,或者您可以使用csv模塊

import csv 

... 

with open('data2.txt') as f: 
    for line in csv.reader(f, delimiter=' '): 
     let, num = line[:2] 
     dd[let].append(num) 

... 

您可以在此操作之後失去爲了recify的是,無論是按鍵排序,當你構建輸出文件(它給你的排序順序不是原創訂購)。

with open('out.csv', 'w') as fo: 
    for k in sorted(dd.keys()): 
     fo.write('%s %s\n' % (k, ' '.join(dd[k]))) 

或只是適應其他答案使用collections.OrderedDict

+1

太棒了,它解決了我的問題。但是我沒有嘗試對輸出進行排序,因爲我使用的工具不需要以任何方式排序列表。謝謝你的回答! –

0

我想你打算在這裏編譯一個dict

d = {} 
for row in csvdata: 
    col1 = row[0] 
    col2 = row[1] 
    if col1 in d: 
     d[col1].append(col2) 
    else: 
     d[col1] = [col2] 

如果你需要得到字典回到你提到你只需通過該字典的鍵循環編譯列表格式的列表。

outlists = [] 
for col1 in d: 
    outlists.append([col1] + d[col1]) # Using '+' to concatenate lists. 

我想象一下,使用字典,從第一列的鍵索引,應該是,如果不是更多,有用。

相關問題