Python 从列表创建元组列表

Python 从列表创建元组列表,python,Python,我有一个清单,例如: data=['January', 'February', 'March', 2007, 2008, 2009, 'value1', 'value2', 'value3'] 现在我需要以以下格式创建元组列表 [('January', 2007,'value1'),('February', '2007','value2'),('March', 2007,'value3'), ('January', 2008,'value1'),('February',

我有一个清单,例如:

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')] 

请让我知道这个概念

有很多解决方案,因为你的问题对你想要什么有点含糊不清,下面是我建议的解决方案

无论您想要什么,第一步是将列表拆分为独立的列表。最干净的方法是使用生成器(与列表相反,对于生成器有很多方法,但是对于您的用例来说,这样做太过分了):

虽然完全可以使用生成器表达式,但它不是特别可读:

(data[y:y+3] for y in range(0, len(data), 3))
无论我在哪里使用
段(数据,3)
,您都可以使用这个生成器表达式,但我将坚持使用更可读的版本

如果您希望输出匹配的
(月、年、值)
,那么答案非常简单:

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

[('January', 2007, 'value1'), ('Febraury', 2008, 'value2'), ('March', 2009, 'value3')]
我们将三个列表作为参数解压到
zip()
中,这为我们提供了
(月、年、值)
项的生成器

如果需要
(月、年、值)
的所有组合,则可以使用
itertools.product()

如输出所示,如果您只想要与值和年份相关的当月产品,那么您需要:

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

>>> 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')]

将给定的列表拆分为树段是操作的一个练习。

这不是有效的Python,因此我不知道您希望列表看起来像什么。请解决这个问题。调用变量
list
不是一个好做法,因为您无法访问内置的
list
@jamylak。这似乎已经解决,然后由编辑器重新引入-我将编辑回使用
数据。我认为元组列表的行尾也应该有逗号。
>>> 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')]
>>> 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')]
>>> 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')]