前提・実現したいこと
Pythonにて以下の問題を解決したいと考えております。
以下リストの各要素の左側を長方形の短辺、右側を長辺とした時に、
「一番面積が小さい長方形」のインデックスを返すようなプログラムを組みたいと考えています。
rects = [
[2.1,4.1],
[0.5,1.1],
[2.5,3.2]
]
発生している問題・エラーメッセージ
最大の場合はわかったのですが、最小がわからなくて困っています
最大の場合は以下のように作りました。
def get_largest_rect(rects):
inde = 0
menseki = 0
for i, [a, b] in enumerate(rects):
if a * b > menseki:
menseki = a * b
inde = i
return rects.index(rects[inde])
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
質問の内容からはズレてしまいますが、プログラム作り方の別のアプローチを挙げておきます。
まず、面積を求める必要があるので、面積を求める関数を作ります。
最大値を求めるのであれば max関数、最小値を求めるのであれば min関数 が使えるか考えてみます。
欲しい値はインデックス番号なので、インデックス番号の中から max、min を探します。
max, min では key引数で比較する値を取り出す関数を指定できます。
その他、いろいろな max, min関数の使い方を紹介します。
python
1def calc_rect_area(rect): 2 a, b = rect 3 return a * b 4 5def get_smallest_rect_index(rects): 6 return min(range(len(rects)), key=lambda index: calc_rect_area(rects[index])) 7 8def get_largest_rect_index(rects): 9 return max(range(len(rects)), key=lambda index: calc_rect_area(rects[index])) 10 11def get_smallest_rect(rects): 12 return min(rects, key=calc_rect_area) 13 14def get_largest_rect(rects): 15 return max(rects, key=calc_rect_area) 16 17def get_smallest_rect_area(rects): 18 return min(map(calc_rect_area, rects)) 19 20def get_largest_rect_area(rects): 21 return max(map(calc_rect_area, rects)) 22 23rects = [ 24 [2.1, 4.1], 25 [0.5, 1.1], 26 [2.5, 3.2], 27] 28 29print("min index:", get_smallest_rect_index(rects)) 30print("max index:", get_largest_rect_index(rects)) 31print("min rect:", get_smallest_rect(rects)) 32print("max rect:", get_largest_rect(rects)) 33print("min area:", get_smallest_rect_area(rects)) 34print("man area:", get_largest_rect_area(rects))
実行結果:
min index: 1 max index: 0 min rect: [0.5, 1.1] max rect: [2.1, 4.1] min area: 0.55 man area: 8.61
投稿2020/07/19 05:20
編集2020/07/19 05:24総合スコア5406
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
python
1def get_min(rects): 2 # enumerateと辞書を各自取り出していき index : 面積 の辞書を生成 3 tmp_dic = {i:sx * sy for i, [sx, sy] in enumerate(rects)} 4 # 面積だけの辞書を生成 5 tmp_lst = tmp_dic.values() 6 # 面積の最小値を抽出 7 min_area = min(tmp_lst) 8 9 # 最小の面積と一致したらkeyを取り出す 10 for k, v in tmp_dic.items(): 11 if v == min_area: 12 min_index = k 13 break 14 15 return min_index
投稿2020/07/19 05:13
総合スコア1438
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/07/19 05:20
0
ベストアンサー
最大の逆をすればよいかと
mensekiに想定範囲上の大きな値を入れておいて
それより小さければ入れ替える
Python
1 2rects = [ 3 [2.1,4.1], 4 [0.5,1.1], 5 [2.5,3.2] 6] 7 8def get_largest_rect(rects): 9 inde = 0 10 menseki = 0 11 for i, [a, b] in enumerate(rects): 12 if a * b > menseki: 13 menseki = a * b 14 inde = i 15 16 return rects.index(rects[inde]) 17 18def get_smallest_rect(rects): 19 inde = 0 20 menseki = 10 ** 10 21 for i, [a, b] in enumerate(rects): 22 print(i, a*b) 23 if a * b < menseki: 24 menseki = a * b 25 inde = i 26 27 return rects.index(rects[inde]) 28 29get_largest_rect(rects) 30 31get_smallest_rect(rects) 32
投稿2020/07/19 04:58
総合スコア2240
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/07/19 05:21
0
最大のプログラムを自分で書いたのであれば、最小が何故分からないのかが分からないです。
・menseki
の初期値を非常に大きな数にしておく(float("inf")
とか)
(inde
の初期値として0
を入れているので、menseki = rects[0][0]*rects[0][1]
でも可)
・>
を<
に変える
投稿2020/07/19 04:56
編集2020/07/19 05:07総合スコア85901
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/07/19 05:20
0
投稿2020/07/19 19:32
編集2020/07/19 19:34総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。