2012-04-18 20 views
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')] 

にタプルのリストを作成する必要があることは私に知らせてください。コンセプト

+5

これは有効なPythonではないので、リストを正確に見たいとは思っていません。それを修正してください。 – ch3ka

+0

変数 'list'を呼び出すのは良い方法ではありません。なぜなら、組み込みの' list'にアクセスできなくなるからです。 – jamylak

+0

@jamylakこれは修正されているように見え、編集者によって再導入されました。私は '' data''を使って編集します。私は、タプルのリストは、行末にカンマを持つことを意図していたと推定しています。 –

答えて

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] 

それはジェネレータ式を使用することは完全に可能ですが、それは特に読めない:私はsegments(data, 3)を使用どこ

(data[y:y+3] for y in range(0, len(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()への引数として、当社の3つのリストを展開(month, year, value)アイテム

あなたは、あなたがitertools.product()を使用することができます(month, year, value)の組み合わせのすべてを望んでいた場合:

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)] 
+0

私はこれにdownvoted得た何か特別な理由はありますか? –

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の練習として残されています。

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')] 
関連する問題