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

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

ただいまの
回答率

88.92%

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

解決済

回答 5

投稿

  • 評価
  • クリップ 0
  • VIEW 195
退会済みユーザー

退会済みユーザー

前提・実現したいこと

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])

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • meg_

    2020/07/19 13:45

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

    キャンセル

回答 5

checkベストアンサー

+1

最大の逆をすればよいかと

mensekiに想定範囲上の大きな値を入れておいて
それより小さければ入れ替える

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])

def get_smallest_rect(rects):
  inde = 0
  menseki = 10 ** 10
  for i, [a, b] in enumerate(rects):
    print(i, a*b)
    if a * b < menseki:
      menseki = a * b
      inde = i

  return rects.index(rects[inde])

get_largest_rect(rects)

get_smallest_rect(rects)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/19 14:21

    ありがとうございます

    キャンセル

+1

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/19 14:20

    ありがとうございます

    キャンセル

+1

def get_min(rects):
    # enumerateと辞書を各自取り出していき index : 面積 の辞書を生成
    tmp_dic = {i:sx * sy for i, [sx, sy] in enumerate(rects)}
    # 面積だけの辞書を生成
    tmp_lst = tmp_dic.values()
    # 面積の最小値を抽出
    min_area = min(tmp_lst)

    # 最小の面積と一致したらkeyを取り出す
    for k, v in tmp_dic.items():
        if v == min_area:
            min_index = k
            break

    return min_index

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/19 14:20

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

    キャンセル

+1

質問の内容からはズレてしまいますが、プログラム作り方の別のアプローチを挙げておきます。

まず、面積を求める必要があるので、面積を求める関数を作ります。
最大値を求めるのであれば max関数、最小値を求めるのであれば min関数 が使えるか考えてみます。
欲しい値はインデックス番号なので、インデックス番号の中から max、min を探します。
max, min では key引数で比較する値を取り出す関数を指定できます。

その他、いろいろな max, min関数の使い方を紹介します。

def calc_rect_area(rect):
    a, b = rect
    return a * b

def get_smallest_rect_index(rects):
    return min(range(len(rects)), key=lambda index: calc_rect_area(rects[index]))

def get_largest_rect_index(rects):
    return max(range(len(rects)), key=lambda index: calc_rect_area(rects[index]))

def get_smallest_rect(rects):
    return min(rects, key=calc_rect_area)

def get_largest_rect(rects):
    return max(rects, key=calc_rect_area)

def get_smallest_rect_area(rects):
    return min(map(calc_rect_area, rects))

def get_largest_rect_area(rects):
    return max(map(calc_rect_area, rects))

rects = [
    [2.1, 4.1],
    [0.5, 1.1],
    [2.5, 3.2],
]

print("min index:", get_smallest_rect_index(rects))
print("max index:", get_largest_rect_index(rects))
print("min rect:", get_smallest_rect(rects))
print("max rect:", get_largest_rect(rects))
print("min area:", get_smallest_rect_area(rects))
print("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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

p.py

rects = [
  [2.1, 4.1],
  [0.5, 1.1],
  [2.5, 3.2]
]  
areas = sorted(rects, key=lambda x: x[0] * x[1])

print(areas)
print(areas[0])
print(areas[-1])

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

実行例
イメージ説明

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る