2017-01-26 12 views
-2

すべての組み合わせのリストにリストを変換しますそれがどのように見えるように、それはカンマ区切りです:Pythonのエレガントな方法は、私のような要素のリストを持っている

[['A', '2', '3', 'Jan'], ['A', '2', '3', 'Feb'] 
['B', '2', '3', 'Jan'], ['B', '2', '3', 'Feb']] 

この使用してPythonのビルトイン関数/ライブラリを達成するためのエレガントな方法は何ですか?

+2

これまで試みたことがありますか? – wim

+1

ボブ、あなたは何をしたいのかよく説明しました。しかし、[SO]は説明に基づくのではなく、むしろ質疑応答に基づいています。特定の質問がありますか? –

+0

いくつかの文字列分割とitertools.permutations? – doctorlove

答えて

5

あなたが最初にコンマ,に基づいてリストの要素を分割し、次にように、所望のリストを取得するためにitertools.productを使用することがあります。

new_listの内容はなり
from itertools import product 
x = ['A, B', '2', '3', 'Jan, Feb'] 

new_list = list(product(*[i.split(', ') for i in x])) 

[('A', '2', '3', 'Jan'), 
('A', '2', '3', 'Feb'), 
('B', '2', '3', 'Jan'), 
('B', '2', '3', 'Feb')] 

Dan Dのコメントに基づいて、中間のList V/s中間生成器比較の比較を以下に示します(timeit)。中間リストの式は少し速いです:

mquadri$ python -m timeit "from itertools import product; list(product(*(i.split(', ') for i in ['A, B', '2', '3', 'Jan, Feb'])))" 
100000 loops, best of 3: 4.83 usec per loop 

mquadri$ python -m timeit "from itertools import product; list(product(*[i.split(', ') for i in ['A, B', '2', '3', 'Jan, Feb']]))" 
100000 loops, best of 3: 3.78 usec per loop 
+0

ジェネレータの式をsplat: 'list(product(* in i)x))')に渡すことで無駄なリストを作成することを避けることができます。 –

+0

@DanD。この場合、中間リストは比較的高速になります。なぜなら、* product *で使用するためには、ジェネレータの式が役に立たないからです。完全に評価する必要があります。 –

+0

両方の 'timeit'比較による修正済みの答え –

関連する問題