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

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

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

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

Q&A

解決済

4回答

3443閲覧

標準入力をリスト(辞書)化したのち、特定のバリュー(max、minなど)のインデックスを表示するには

gyanonsh

総合スコア19

Python 3.x

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

0グッド

0クリップ

投稿2018/10/15 07:56

データが標準入力として以下のように与えられます。
#データの個数
5
#データ
10 25
10 54
41 62
45 11
14 12

ここで、データの左の数字から右の数字の差が上位3番目までの
インデックスを表示したいのです。
以下のように、2次元リスト化して左の数字をc、右の数字をdとするとこまで
いったのですが、この後「差」を出していこうにも、インデックスの表記を
どうすればいいのかがわかりません。
enumerateメソッドを使うのか、indexメソッドを使うのか
いろいろ試したのですが、出力までこぎつけれません。
どなたか、ご教授下さい。

a= input().split()
A=int(a)
my_list=[]
for i in range(A):
my_list.append(input().split())
c = my_list[i][0]
d = my_list[0][i]

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

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

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

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

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

guest

回答4

0

ベストアンサー

以下のように、2次元リスト化して左の数字をc、右の数字をdとするとこまで

いった

Python

for i in range(A):
my_list.append(input().split())
c = my_list[i][0]
d = my_list[0][i]

いえ、できていないです。
実際に c と d の値を覗いてみると良いでしょう。

Python

1# a= input().split() 2 3a= int(input()) 4A=int(a) 5my_list=[] 6 7for i in range(A): 8 my_list.append(input().split()) 9 c = my_list[i][0] 10 d = my_list[0][i] 11 12 print(c, d)

実行結果 Wandbox

10 10 10 25 Traceback (most recent call last): File "prog.py", line 8, in <module> d = my_list[0][i] IndexError: list index out of range

まずは差のリストを作ることから始めましょう。
次のようなリストを作れれば、問題の半分は解けたと言っても良いでしょう。

Python

1>>> diffs 2[15, 44, 21, -34, -2]

投稿2018/10/15 08:06

LouiS0616

総合スコア35660

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

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

gyanonsh

2018/10/15 09:03

ありがとうございます。 いちおう、自分なりに出してみましたが、 もっと、すっきりできるはずだとおもいながら・・。
LouiS0616

2018/10/15 09:05

実際には二行目でエラーが出るはずなのですが、全く同じコードを実行しているのでしょうか?
gyanonsh

2018/10/15 09:06

すみません、よく teratailの使い方を理解しておらず、 自己回答欄に生意気にも投稿してしまいました・・。 以下の方法はどうでしょうか?
gyanonsh

2018/10/15 09:09

すみません。これです a= input() A = int(a) list_01 = [] list_02 = [] for i in range(A): x1,y1=[int(i) for i in input().split()] list_01.append(x1) list_02.append(y1) diff = [x-y for (x, y) in zip(list_01, list_02)] index_max = diff.index(max(diff))+1 print(index_max)
LouiS0616

2018/10/15 09:10

リストdiffを作ること及び最大値のインデックスの取得はループ後にした方が良いですね。
gyanonsh

2018/10/15 09:10

a= input() A = int(a) list_01 = [] list_02 = [] for i in range(A): x1,y1=[int(i) for i in input().split()] list_01.append(x1) list_02.append(y1) diff = [x-y for (x, y) in zip(list_01, list_02)] index_max = diff.index(max(diff))+1 print(index_max)
LouiS0616

2018/10/15 09:11

コメント欄では行頭のスペースが削除されますので、質問を編集して追記する形にすると良いでしょう。
gyanonsh

2018/10/15 09:52

なるほど。そのとおりですね。 いつもありがとうございます!
guest

0

差のリストを先に作ってから、enumerateでインデックスと組みにして、sortedでkeyをうまく指定してソートすればよいかと思います。

追記

python

1n = int(input()) 2 3diff_lst = [] 4for _ in range(n): 5 a, b = map(int, input().split()) 6 diff_lst.append(a-b) 7 8for i, d in sorted(enumerate(diff_lst), key=lambda x:x[1], reverse=True)[:3]: 9 print(i) 10

投稿2018/10/15 08:05

編集2018/10/15 12:18
hayataka2049

総合スコア30933

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

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

gyanonsh

2018/10/15 09:04

hayatakaさん ありがとうございます。 色々な関数とかメソッドを使って、チャレンジするのですが、 それぞれの関数などが対応する型を理解していないので なかなか、カチっとこないのが問題です。。 悔しいですねぇ・・。
hayataka2049

2018/10/15 12:19 編集

この手の問題でうまくいかないときはたいてい難しく考えすぎなので、とりあえずシンプルに考えることをおすすめします。
gyanonsh

2018/10/17 03:57

>難しく考えすぎ。。 最近そう思います。ありがとうございました!
guest

0

python

1A= int(input()) 2list_01 = [] 3list_02 = [] 4for i in range(A): 5 x1,y1=[int(i) for i in input().split()] 6 list_01.append(x1) 7 list_02.append(y1) 8 diff = [x-y for (x, y) in zip(list_01, list_02)] 9 index_max = diff.index(max(diff))+1 10print(index_max)

投稿2018/10/15 09:05

gyanonsh

総合スコア19

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

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

0

numpy を使うのがおすすめです。

手順

  1. 行ごとに差の絶対値を計算する。(numpy.abs())
  2. 昇順ソートする。(numpy.agrsort() で降順ソートし、[::-1] で反転させる。)
  3. 差が大きい上位3つのインデックスを取り出す。([:3])

サンプルコード

import numpy as np # 入力を受け付ける。 data = [] for i in range(2): values = input('空白区切りで2つの数字を入力してください。 (例: 1 5)').split() data.append(list(map(int, values))) data = np.array(data) print(data) # 行ごとに差を計算する。 diff = np.abs(data[:, 0] - data[:, 1]) print(diff) # [15 44 21 34 2] # 昇順ソートする。 indices = np.argsort(diff)[::-1] print(indices) # [4 0 2 3 1] for i, index in enumerate(indices): print('上位 {} 番目に差が大きい行 {} 値 {}'.format(i + 1, index, data[index])) # 上位 1 番目に差が大きい行 1 値 [10 54] # 上位 2 番目に差が大きい行 3 値 [45 11] # 上位 3 番目に差が大きい行 2 値 [41 62] # 上位 4 番目に差が大きい行 0 値 [10 25] # 上位 5 番目に差が大きい行 4 値 [14 12]

投稿2018/10/15 08:10

編集2018/10/15 09:15
tiitoi

総合スコア21956

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問