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

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

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

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

Q&A

解決済

5回答

325閲覧

Python3 辞書を使った計算で正解は出るがこれじゃない感

opyon

総合スコア1009

Python 3.x

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

0グッド

0クリップ

投稿2018/10/03 18:16

編集2018/10/03 19:13

例えば蓋付きの木箱を作るレシピがあって必要な材料の在庫がある時に何個作れるかを計算するプログラムを作るとします。
私の場合はレシピと在庫を辞書を使って計算してなんとか正解が出るように作れたのですが、もっとスマートな書き方があるのではないかと模索中です。

なんとなく想像するのですが実装するきっかけが無くコードを書き出せないでいます。
例えば辞書を使わない方法でこんな書き方も出来るよというサンプルやリンクなどあればご教示ください。
自分でも何かしら実装できるように模索しているのでヒントなど頂ければ助かります。

Python3

1recipe = dict([['板',6],['釘',12],['蝶番',2],['ネジ',8]]) 2stock = dict([['板',100],['釘',101],['蝶番',102],['ネジ',103]]) 3count = 0 4chk = True 5 6#本題では無いのでここは無視して常に在庫種類はある前提でOKです 7#全ての材料の種類がストックに含まれるか確認 8for parts in recipe: 9 if parts not in stock: 10 chk = False 11 break 12 13#何れかの在庫が足りなくなるまで在庫から必要数を引き算 14while(chk): 15 for k, v in recipe.items(): 16 if stock[k] >= v: 17 stock[k] = stock[k] - v 18 else: 19 chk = False 20 break 21 if chk: 22 count += 1 23print(count,'個作れます')
8 個作れます

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

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

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

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

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

guest

回答5

0

問題を線形計画問題としてとらえてpulpモジュールを使って実装するという方法があります。
今回の場合、明らかにtoo muchですが、この問題の発展型として、以下のようなケースはかなり便利と思います。
1.レシピの異なる製品A,B,Cがある
2.各製品の価格は異なる
3.所定の原材料在庫のもと、総価格を最大にする製品A,B,Cの製造数の組合せを求める

サンプルコードは以下の投稿を参照してください。
https://qiita.com/mzmttks/items/82ea3a51e4dbea8fbc17

投稿2018/10/03 23:51

R.Shigemori

総合スコア3376

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

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

opyon

2018/10/04 00:00

ありがとうございます。 配列操作を手こずる私にはまだ難しい内容のようでした。 今後の課題として参考にさせていただきます。
guest

0

s.py

python3

1recipe = [6, 12, 2, 8] 2stock = [100, 101, 102, 103] 3print(list(zip(recipe, stock))) 4m = min([y // x for (x, y) in (zip(recipe, stock))]) 5print(m) 6 7recipe = dict([['板',6],['釘',12],['蝶番',2],['ネジ',8]]) 8stock = dict([['板',100],['釘',101],['蝶番',102],['ネジ',103]]) 9print([[recipe[k], stock[k]] for k in recipe.keys()]) 10m = min([y // x for (x, y) in [[recipe[k], stock[k]] for k in recipe.keys()]]) 11print(m)

実行結果
イメージ説明

  • 2つのリストの要素同士を演算したい

https://www.lifewithpython.com/2014/04/python-operate-or-combine-2-lists.html

  • Pythonで辞書に要素を追加、辞書同士を連結(結合)

https://note.nkmk.me/python-dict-add-update/

投稿2018/10/03 22:08

katoy

総合スコア22324

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

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

opyon

2018/10/03 22:14

ありがとうございます。 for文と辞書の使い方とても参考になります。
guest

0

とりあえずデータを持つための形式をこうする。

python

1item_names = ["板", "釘", "蝶番", "ネジ"] 2recipe = [6, 12, 2, 8] 3stock = [100, 101, 102, 103]

ベクトル演算を使いたいのでnumpyに頼ります(外部ライブラリを使わないで書くなら、ジェネレータ式と//演算子、min()関数を組み合わせてください)。

python

1import numpy as np 2print(np.floor_divide(stock, recipe).min(), "個作れます")
全体をまとめたコード

python

1import numpy as np 2 3item_names = ["板", "釘", "蝶番", "ネジ"] 4recipe = [6, 12, 2, 8] 5stock = [100, 101, 102, 103] 6 7print(np.floor_divide(stock, recipe).min(), "個作れます") # => 8 個作れます 8

投稿2018/10/03 19:25

編集2018/10/03 19:31
hayataka2049

総合スコア30933

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

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

hayataka2049

2018/10/03 19:30 編集

回答書いてる中にBAが決まった上に、微妙にopyonさん自身のコードと内容がかぶってて悲しみ
opyon

2018/10/03 20:39

ありがとうございます。 やはりnumpyが良さそうですね。 辞書や2次元配列のままnumpyに変換したりして処理してたのですがなかなか上手くいかずもがいてました^^; リスト順序を維持するように気をつけて数値のみのリストにしたらあっさり行列計算出来ました。 まだnumpyの基礎の基礎ですが徐々に使えるように練習中です。
guest

0

ベストアンサー

シンタックスがpython3でない気がしますが一応。
各パーツで最大何個作れるかを計算して、その最小値を返します。

python

1how_many = [] 2for rcp_key in recipe: 3 how_many.append( stock[rcp_key] // recipe[rcp_key] ) 4 5productable = min( how_many ) 6 7print( productable, '個作れます。' )

投稿2018/10/03 18:42

編集2018/10/03 18:44
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

opyon

2018/10/03 19:00 編集

ありがとうございます。 辞書を使う場合はとてもスマートですね。 参考になります。 質問に書き忘れていたのですが辞書を使わない方法も探しています。(質問に追記しました)
opyon

2018/10/03 19:10

>シンタックスがpython3でない気がしますが一応。 すみません、「シンタックスがpython3でない」というのがどこを指しているのかわからないのですが教えて頂けますか?
opyon

2018/10/03 19:22

@ALMIさんの回答からヒントを得られました。 ありがとうございました。
guest

0

numpyを使った方法で書けないか模索していたのですが、@ALMIさんの回答からヒントを得て出来ました。
ありがとうございました。

Python3

1import numpy as np 2#入力データやデータ整形の過程は省略 3recipe = [['板',6],['釘',12],['蝶番',2],['ネジ',8]] 4stock = [['板',100],['釘',101],['蝶番',102],['ネジ',103]] 5rc = [x[1] for x in recipe] 6st = [x[1] for x in stock] 7rc = np.array(rc) 8st = np.array(st) 9print(rc,'配列確認') 10print(st,'配列確認') 11print(min(st // rc),'個作れます') 12
[ 6 12 2 8] 配列確認 [100 101 102 103] 配列確認 8 個作れます

投稿2018/10/03 19:20

opyon

総合スコア1009

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問