有很多解決方案,因爲您的問題對您想要的有點含糊不清,下面是我建議的解決方案。
無論你想要什麼,第一步是將列表拆分成獨立的列表。要做到這一點,最徹底的方法是用一臺發電機(也有這樣做的,而不是名單發電機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)]
這是無效的Python,所以我不知道你想要列表看起來像什麼。請解決這個問題。 – ch3ka 2012-04-18 14:22:10
調用變量'list'並不是一個好習慣,因爲你失去了對內建列表的訪問。 – jamylak 2012-04-18 16:10:29
@jamylak這似乎已經修復,然後由編輯重新引入 - 我將編輯回使用「數據」。我假設元組列表的意圖是在行結束處也有逗號。 – 2012-04-18 18:32:51