2013-07-20 70 views
2

可以說我有一個函數可以根據函數調用生成X個相等長度的列表。例如,如果在函數調用中有5個單獨的字符串,它應該生成5個列表並將它們合併爲一個。python-2.7 .zip多個生成列表

要做到這一點,我使用這個功能樣機:

def FetchData(*args): 
    returnlist = [] 
    for arg in args: 
     datalist = generate.list(arg) #obviously not a real method. 

     if returnlist == [] 
      returnlist = datalist 
     else: 
      returnlist = map(list, zip(returnlist, datalist)) 

    return returnlist 

如果有0,1或2個參數也能正常工作。 但是,如果有更多的,事情就變得怪異:

下面是一個簡單的結果,當FetchData()得到4個參數:

>>> returnlist[0] 
>>> [[['a', 'b'], 'c'], 'd'] 

但我需要:

>>> ['a','b','c','d'] 

我八九不離十固定它通過'分離'每個返回列表項目並刪除多餘的符號,但這似乎太粗糙。

我相信有一種方法可以正確地.zip生成的列表,而不需要在之後理解結果。

任何人都可以幫忙嗎?

+0

我不完全知道你是問什麼,但它聽起來像你想你寫自己:[itertools.chain](http://docs.python.org/2/library/itertools.html#itertools.chain)(或類似的東西) –

+0

不,更多沿着itertools.izip的線但是,這樣做不工作在一個循環,我仍然得到上述結果。回顧一下,我試圖從未知數量的列表中獲取一個壓縮列表。因此,循環。 – Andy

+1

因此給出'[1,2,3],[4,5,6],[7,8 9]'需要什麼輸出? –

回答

4

如何如下:

from itertools import chain 
def fetch_data(*args): 
    return list(chain.from_iterable(zip(*args))) 

a = [ [1,2,3], [4,5,6], [7, 8, 9] ] 

print fetch_data(*a) 
# [1, 4, 7, 2, 5, 8, 3, 6, 9] 

或者return map(list, zip(*args))會給你:[[1, 4, 7], [2, 5, 8], [3, 6, 9]]

+0

謝謝你的幫助。 – Andy