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

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

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

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

2回答

3015閲覧

Pythonのitertoolsにリストが入った辞書型の値を渡す方法がわかりません。

HearthXml

総合スコア51

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2017/12/19 11:11

編集2017/12/19 11:24

python

1import itertools 2 3dict = {A:["アキ","ヒロシ"], B:["1","2"]} 4 5print(list(itertools.product(dict))) 6
期待する出力 アキ1 ヒロシ1 アキ2 ヒロシ2

itertoolsという関数にリストが入った辞書型の値を複数の一時配列で渡したいのですが、valuesで渡すと、二次配列になってしまいます。
うまい渡し方を教えてください。お願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

こういうことですか?

Python

1import itertools 2A = ("アキ","ヒロシ") 3B = ("1","2") 4C = ("spam","ham","egg") 5D = [A] 6print( *itertools.product( *D ) ) 7D = [A,B] 8print( *itertools.product( *D ) ) 9D = [A,B,C] 10print( *itertools.product( *D ) )

質問が変更されたので、回答を変更

Python

1import itertools 2dict = {'A':["アキ","ヒロシ"], 'B':["1","2"]} 3print( *itertools.product( *dict.values() ) )

投稿2017/12/19 11:21

編集2017/12/19 11:30
Lhankor_Mhy

総合スコア36115

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

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

HearthXml

2017/12/19 11:26

ごめんなさい。質問内容を大幅に変更しました。
HearthXml

2017/12/20 23:34

回答ありがとうございます。 とてもシンプルで分かりやすいですね。 ベストアンサーにします。
guest

0

質問が変わったので、とりあえず出力に合うようなコードを1つ。

python

1import itertools 2d = {'A':["アキ","ヒロシ"], 'B':["1","2"]} 3l = ['B', 'A'] 4print( '\n'.join( [a+b for b,a in itertools.product(*[d[k] for k in l])] ) )

以下2点に気をつけてください。
辞書は順序がありませんので、コードの見た目の順番に取り出されるとは限りません。
リストを渡す順番によって、.productのループの回り方も変わります。


evalはできるのなら使わないほうがよいと思われます。
以下の実装ならリストをall_lists.appendしていけば目的が果たせそうです。

python

1import itertools 2 3A = ("アキ","ヒロシ") 4B = ("1","2") 5all_lists = [A, B] 6print(list(itertools.product(*all_lists))) 7# [('アキ', '1'), ('アキ', '2'), ('ヒロシ', '1'), ('ヒロシ', '2')] 8 9C = ("A","B") 10all_lists.append(C) 11print(list(itertools.product(*all_lists))) 12# [('アキ', '1', 'A'), ('アキ', '1', 'B'), ('アキ', '2', 'A'), ('アキ', '2', 'B'), ('ヒロシ', '1', 'A'), ('ヒロシ', '1', 'B'), ('ヒロシ', '2', 'A'), ('ヒロシ', '2', 'B')]

追記:

リスト・辞書の展開はよく使うテクニックです。
覚えておいて損はありません。
http://nonbiri-tereka.hatenablog.com/entry/2014/08/16/090437
https://qiita.com/7of9/items/e23bdd6e8d4d7997104a
https://teratail.com/questions/52472
http://d.hatena.ne.jp/xef/20121027/p2

投稿2017/12/19 11:18

編集2017/12/19 11:51
mkgrei

総合スコア8560

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

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

HearthXml

2017/12/19 11:26

ごめんなさい。質問内容を大幅に変更しました。
HearthXml

2017/12/20 23:32

回答ありがとうございます。 辞書型の順番を保つためOrderedDictを採用します。 教材も教えて頂きますありがとうございます。
mkgrei

2017/12/21 02:37

OrderedDictは代入した順番を保存することに気をつけてください。 初期化で一気に与えると、見た目と異なる順番になることがあった気がします。
HearthXml

2017/12/21 10:09

ありがとうございます。 すこし認識違いがありましたね。 また何かありましたらその時はよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問