有很多解决方案,因为您的问题对您想要的内容有点模棱两可,以下是我建议的解决方案。
无论您想要什么,第一步是将列表拆分为独立的列表。最干净的方法是使用生成器(对于生成器,还有其他方法可以做到这一点,而不是列表,但对于您的用例来说,这是矫枉过正的):
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)]