我有一个列表,例如:
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')]
请让我知道这个概念
答案 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')]