1

我有一个清单,例如:

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

请告诉我这个概念

4

3 回答 3

1

有很多解决方案,因为您的问题对您想要的内容有点模棱两可,以下是我建议的解决方案。

无论您想要什么,第一步是将列表拆分为独立的列表。最干净的方法是使用生成器(对于生成器,还有其他方法可以做到这一点,而不是列表,但对于您的用例来说,这是矫枉过正的):

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)]
于 2012-04-18T14:22:39.673 回答
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 的练习。

于 2012-04-18T14:26:54.913 回答
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')]
于 2012-04-18T16:05:19.907 回答