从列表中创建元组列表

时间:2012-04-18 14:13:21

标签: python

我有一个列表,例如:

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

请让我知道这个概念

3 个答案:

答案 0 :(得分: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)]

答案 1 :(得分: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的练习。

答案 2 :(得分: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')]