質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

4390閲覧

pythonを用いた、組み合わせ列挙の方法

A5size

総合スコア13

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/10/31 10:14

pythonを用いて、
組み合わせの一覧を表示するプログラムを
作りたいと考えております。

例えば、

python

1a=[1, 2, 3] 2b=[5, 6]

という2つの配列に対して、

python

1[[1, 5], [1, 6], [2, 5], [2, 6], [3, 5], [3, 6]]

のような結果を返すものです。

この例のように、
予め、配列の個数がわかっていれば、
for文を用いて

python

1data = [] 2for i in a: 3 for j in b: 4 data.append([i, j])

とするか、
もしくはitertoolsを使って、

python

1data = list(itertools.product(a, b))

とすることができます。

しかし、今回厄介なのが、
この配列の個数が状況によって変わる
(データをファイルから読み込むようなものを考えているので、
読み込むファイルで変わる)
というこであり、
場合によっては、

python

1a=[1, 2, 3] 2b=[5, 6] 3c=[9, 8, 7, 6, 5]

であったり

python

1a=[1, 2, 3] 2b=[5, 6] 3c=[9, 8, 7, 6, 5] 4d=[11, 12] 5e=[1, 2, 3, 4, 5]

だったりするわけです。
実際これらの配列は、
辞書に格納しようと考えており、

python

1dic={'a':[1, 2, 3], 'b':[5, 6]}

このような状態から

python

1[[1, 5], [1, 6], [2, 5], [2, 6], [3, 5], [3, 6]]

を得たいと考えております。
始めは、単に入れ子構造にすれば良いと考え、

python

1dic={'a':[1, 2, 3], 2 'b':[5, 6], 3 'c':[9, 8, 7, 6, 5], 4 'd':[11, 12]} 5dick=dic.keys() 6data = itertools.product(dic[dick[0]], dic[dick[1]]) 7for dk in range(len(dick)-2): 8 data = itertools.product(data, dic[dick[dk+2]])

のようにしようと考えました。
しかし、この場合、
次のようになってしまいます。

python

1[(((1, 9), 5), 11), 2 (((1, 9), 5), 12), 3 (((1, 9), 6), 11), 4 ...

一方イメージしているのは
次のような感じです。

python

1[(1, 9, 5, 11), 2 (1, 9, 5, 12), 3 (1, 9, 6, 11), 4...

以上長くなってしまいましたが、
みなさんのお力をお借りしたいです。
どうかよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

可変長引数に対して配列を引数展開すればいいと思います。

python

1data = [[1, 2, 3], [5, 6], [9, 8, 7, 6, 5]] 2list(itertools.product(*data)) 3#=> [(1, 5, 9), (1, 5, 8), (1, 5, 7), (1, 5, 6), (1, 5, 5), (1, 6, 9), (1, 6, 8), (1, 6, 7), (1, 6, 6), (1, 6, 5), (2, 5, 9), (2, 5, 8), (2, 5, 7), (2, 5, 6), (2, 5, 5), (2, 6, 9), (2, 6, 8), (2, 6, 7), (2, 6, 6), (2, 6, 5), (3, 5, 9), (3, 5, 8), (3, 5, 7), (3, 5, 6), (3, 5, 5), (3, 6, 9), (3, 6, 8), (3, 6, 7), (3, 6, 6), (3, 6, 5)]

投稿2018/10/31 10:19

編集2018/10/31 10:20
mather

総合スコア6753

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

A5size

2018/10/31 10:29

恥ずかしながら、 可変長引数に対して こんな引数の渡し方があることを知りませんでした。 まさにやりたかったことです。 非常に助かりました。 ありがとうございます。
guest

0

python

1dic={'a':[1, 2, 3], 2 'b':[5, 6], 3 'c':[9, 8, 7, 6, 5], 4 'd':[11, 12]} 5oldresult=[[]] 6for k in dic: 7 result=[] 8 for r in oldresult: 9 for i in dic(k): 10 result.append(r+[i]) 11 oldresult=result 12print result

投稿2018/10/31 10:29

hiro-k

総合スコア902

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問