2013-10-26 91 views
8

我有以下使用zip()的python代碼,它似乎會導致意外的數據截斷。python:避免列表的zip截斷

inc_data = [[u'Period Ending', u'Dec 31, 2012', u'Dec 31, 2011', u'Dec 31, 2010'], 
      [u'Total Revenue\n', u'104,507,100\n', u'106,916,100\n', u'99,870,100\n'], 
      [u'Cost of Revenue\n',u'56,000,000\n'] 
      ] 

inc_data2 = zip(*inc_data) 
for i in inc_data2: 
    print i 

只打印:

(u'Period Ending', u'Total Revenue\n', u'Cost of Revenue\n') 
(u'Dec 31, 2012', u'104,507,100\n', u'56,000,000\n') 

但我想它打印以下,但顯然我必須在填料用手爲了從截斷inc_data添加u''防止拉鍊()。但我不知道如何編碼。

(u'Period Ending', u'Total Revenue\n', u'Cost of Revenue\n') 
(u'Dec 31, 2012', u'104,507,100\n', u'56,000,000\n') 
(u'Dec 31, 2011', u'106,916,100\n', u'') 
(u'Dec 31, 2010', u'99,870,100\n', u'') 

描述上文inc_data,

inc_data = [ [x], 
      [y], 
      [z] ] 

如何讓我的x,y和z是相同的長度?長度是x,y或z的最大長度?

(u'Period Ending', u'Total Revenue\n', u'Cost of Revenue\n') 
(u'Dec 31, 2012', u'104,507,100\n', u'56,000,000\n') 
(u'Dec 31, 2011', u'106,916,100\n', u'') 
(u'Dec 31, 2010', u'99,870,100\n', u'') 

對不起,冗長而羅嗦的解釋問題。你能幫助我還是指出我有一個類似的問題,如果存在的話,已經回答了?非常感謝!

+2

使用[itertools.izip_longest](http://docs.python.org/2/library/itertools.html#itertools.izip_longest)用'fillvalue = u''' – falsetru

回答

16

使用izip_longest

from itertools import izip_longest 

inc_data = [[u'Period Ending', u'Dec 31, 2012', u'Dec 31, 2011', u'Dec 31, 2010'], 
      [u'Total Revenue\n', u'104,507,100\n', u'106,916,100\n', u'99,870,100\n'], 
      [u'Cost of Revenue\n',u'56,000,000\n'] 
      ] 

print list(izip_longest(*inc_data, fillvalue=u'')) 


# [(u'Period Ending', u'Total Revenue\n', u'Cost of Revenue\n'), 
    (u'Dec 31, 2012', u'104,507,100\n', u'56,000,000\n'), 
    (u'Dec 31, 2011', u'106,916,100\n', u''), 
    (u'Dec 31, 2010', u'99,870,100\n', u'')] 
+0

izip_longest完美運作。一旦數據與izip_longest交換,你知道我如何刪除第一行,這樣我就沒有(u'Period Ending',u'Total Revenue \ n',u'Cost of Revenue \ n')?實質上,我將把數據存儲在sqlite3表中。非常感謝! – vt2424253

+0

使用[slice:](http://stackoverflow.com/questions/509211/pythons-slice-notation)'[[1,2],[3,4],[5,6]] [1:] = [[3,4],[5,6]]'list [1:]'的片段將移除第一個元組列表。所以你可以這樣做:'list(izip_longest(* inc_data,fillvalue = u''))[1:]'例如 – dawg

+0

謝謝。試驗和錯誤會產生你給我的結果。我不知道它被稱爲切片,所以我無法搜索該技術。謝謝你的提示。 – vt2424253