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

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

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

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

Q&A

解決済

5回答

1472閲覧

Pythonにて要素が最小になるインデックス

退会済みユーザー

退会済みユーザー

総合スコア0

Python

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

0グッド

0クリップ

投稿2020/07/19 04:42

前提・実現したいこと

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ページで確認できます。

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

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

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

meg_

2020/07/19 04:45

コードは「コードの挿入」で記入してください。
guest

回答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
shiracamus

総合スコア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

nto

総合スコア1438

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

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

退会済みユーザー

退会済みユーザー

2020/07/19 05:20

ありがとうございます! 助かりました
guest

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

aokikenichi

総合スコア2218

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

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

退会済みユーザー

退会済みユーザー

2020/07/19 05:21

ありがとうございます
guest

0

最大のプログラムを自分で書いたのであれば、最小が何故分からないのかが分からないです。
mensekiの初期値を非常に大きな数にしておく(float("inf")とか)
indeの初期値として0を入れているので、menseki = rects[0][0]*rects[0][1]でも可)
><に変える

投稿2020/07/19 04:56

編集2020/07/19 05:07
otn

総合スコア84538

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

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

退会済みユーザー

退会済みユーザー

2020/07/19 05:20

ありがとうございます
guest

0

sort 機能をつかうと簡素に掛けます。

p.py

python3

1rects = [ 2 [2.1, 4.1], 3 [0.5, 1.1], 4 [2.5, 3.2] 5] 6areas = sorted(rects, key=lambda x: x[0] * x[1]) 7 8print(areas) 9print(areas[0]) 10print(areas[-1])

質問は、要素でなく その index を求めるわけですが、すこの工夫で index をmとめるようにできるはずです。try してみてください。

実行例
イメージ説明

投稿2020/07/19 19:32

編集2020/07/19 19:34
katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問