2014-01-06 93 views
0

我的問題是動態提取的列表:我想加入到由列的CSV文件中的一些列表,例如我有這些列表:蟒蛇,按列添加列表到CSV,與其他數據

[1, 2, 2, 3, 3, t1] 
[0, 3, 3, 2, 3, t2] 
[5, 3, 2, 1, 2, t3] 

將它們添加到CSV文件是這樣的:

1 0 5 
2 3 3 
2 3 2 
3 2 1 
3 3 2 
t1 t2 t3 

我查了一些其他職位使用ZIP:

zip(a, b, c) gives you a list of rows: [(1, 4, 7), (2, 5, 8), (3, 6, 9)]

但我的列表是從其他數據源動態提取的,例如 從字典:

for x, y in cpu_dict.items(): 
    y.append(x)    
    # y is a number list [1,2,2,3,3] etc. and x is a string 't1' etc. 

字典cpu_dict是一樣的東西:

{'t1': [3,3,4,2,2,1,3], 't2': [2,4,3,2,1,2,3], 't3': [2,2,3,4,5,2,3] ... many more...} 

所有表數是相同的長度。我應該如何使用zip()來處理這種情況?

有幫助嗎?提前致謝。

=================================

得到了解決,感謝kroolik。

+0

你能準確地顯示'cpu_dict'嗎?你想在你的例子中使用zip添加到y列表? – mojibuntu

+0

我不明白你爲什麼不能用zip解決方案轉換 – wim

+1

字典沒有排序;你希望以什麼順序將字典值變成列? –

回答

0

使用izip

>>> cpu_dict = {'t1': [1,2,3,4,5], 't2': [6,7,8,9,10], 't3': [11,12,13,14,15]} 
>>> list(izip(*(y + [x] for x, y in cpu_dict.iteritems()))) 
[(6, 11, 1), 
(7, 12, 2), 
(8, 13, 3), 
(9, 14, 4), 
(10, 15, 5), 
('t2', 't3', 't1')] 

y + [x]評估爲[1,2,3,4,5,'t1'], [6,7,8,9,10,'t2'], [11,12,13,14,15,'t3']。 列的順序是任意的(即正常的字典是如何工作的)。

然後,您可以將其送到csv.writerows或每行分別到csv.writerow

如果你想列進行排序,試試這個來代替:

>>> cpu_dict = {'t1': [1,2,3,4,5], 't2': [6,7,8,9,10], 't3': [11,12,13,14,15]} 
>>> sorted_items = sorted(cpu_dict.iteritems(), key=lambda x: int(x[0][1:])) 
>>> list(izip(*(y + [x] for x, y in sorted_items))) 
[(1, 6, 11), 
(2, 7, 12), 
(3, 8, 13), 
(4, 9, 14), 
(5, 10, 15), 
('t1', 't2', 't3')] 

使用izip用列表的動態數量的關鍵,是arbitrary arguments list notation。它允許你將可迭代的值轉換爲位置參數,例如:

foo(*[1,2,3,4,5,6,object()]) == foo(1,2,3,4,5,6,object()) 
+0

感謝您的回覆。我改變了我的代碼,需要添加:從itertools import *。但列表仍然沒有正確添加到csv中。 – Xiangwu

+0

@ user2068965,你的代碼現在看起來如何?簡單的'writer.writerows(izip(*(y + [x] for x,y in sorted_items))'應該做的伎倆。 –

+0

嗨,我仍然沒有得到正確的,我不知道我的作家部分。它給出了一個錯誤:SyntaxError:invalid syntax。鏈接到我的代碼在Dropbox中:https://www.dropbox.com/s/1ojil5co1sk76my/bowtie_extract_time.py – Xiangwu