2012-04-18 82 views
1

我有一個列表,例如:從列表中創建一個元組列表

data=['January', 'February', 'March', 
     2007, 2008, 2009, 
     'value1', 'value2', 'value3'] 

現在我需要在以下格式創建的元組的列表

[('January', 2007,'value1'),('February', '2007','value2'),('March', 2007,'value3'), 
('January', 2008,'value1'),('February', 2008,'value2'),('March', 2008,'value3'), 
('January', 2009,'value1'),('February', 2009,'value2'),('March', 2009,'value3')] 

請讓我知道概念

+5

這是無效的Python,所以我不知道你想要列表看起來像什麼。請解決這個問題。 – ch3ka 2012-04-18 14:22:10

+0

調用變量'list'並不是一個好習慣,因爲你失去了對內建列表的訪問。 – jamylak 2012-04-18 16:10:29

+0

@jamylak這似乎已經修復,然後由編輯重新引入 - 我將編輯回使用「數據」。我假設元組列表的意圖是在行結束處也有逗號。 – 2012-04-18 18:32:51

回答

1

有很多解決方案,因爲您的問題對您想要的有點含糊不清,下面是我建議的解決方案。

無論你想要什麼,第一步是將列表拆分成獨立的列表。要做到這一點,最徹底的方法是用一臺發電機(也有這樣做的,而不是名單發電機other ways,但對你的使用情況這是矯枉過正):

def segments(l, n): 
    for i in range(0, len(l), n): #Use xrange in python 2.x 
     yield l[i:i+n] 

雖然這是完全有可能用生成器表達式,它不是特別可讀:

(data[y:y+3] for y in range(0, len(data), 3)) 

無論我用segments(data, 3),你可以使用這個生成器表達式來代替,但我會堅持到更可讀的版本。

如果你想匹配(month, year, value)的輸出,那麼答案很簡單:

list(zip(*segments(data, 3)) #No need to use list() in 2.x 

產地:

[('January', 2007, 'value1'), ('Febraury', 2008, 'value2'), ('March', 2009, 'value3')] 

我們解開我們的三個列表作爲參數爲zip()這讓我們的發電機(month, year, value)項目。

如果您想讓所有的(month, year, value)的組合,那麼你可以使用itertools.product()

from itertools import product 
... 
list(product(*segments(data, 3)) 

如果你只是想,作爲輸出顯示,該月的集產品綁在價值和一年,那麼你將需要:

from itertools import product 
... 
months, years, values = segments(data, 3) 
[(month, year, value) for ((month, value), year) in product(zip(months, values), years)] 
+0

我對此有任何特別的理由嗎? – 2012-04-18 15:34:10

1

喜歡的東西:

>>> l1 = ['January', 'February', 'March'] 
>>> l2 = [2007,2008,2009] 
>>> l3 = ['value1','value2','value3'] 
>>> for year in l2: 
...  print zip(l1, [year] * len(l1), l3) 
... 
[('January', 2007, 'value1'), ('February', 2007, 'value2'), ('March', 2007, 'value3')] 
[('January', 2008, 'value1'), ('February', 2008, 'value2'), ('March', 2008, 'value3')] 
[('January', 2009, 'value1'), ('February', 2009, 'value2'), ('March', 2009, 'value3')] 

將給定列表拆分爲樹塊,作爲OP的練習。

0
>>> from itertools import product,cycle 
>>> data = ['January','February','March', 2007,2008,2009,'value1','value2','value3'] 
>>> block = 3 
>>> months,years,values = zip(*[iter(data)]*block) 
>>> [(m,y,v) for (y,m),v in zip(product(years,months),cycle(values))] 
[('January', 2007, 'value1'), ('February', 2007, 'value2'), ('March', 2007, 'value3'), 
('January', 2008, 'value1'), ('February', 2008, 'value2'), ('March', 2008, 'value3'), 
('January', 2009, 'value1'), ('February', 2009, 'value2'), ('March', 2009, 'value3')]