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

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

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

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

Python

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

Q&A

解決済

1回答

352閲覧

Python 入力が早い番号を返す方法

nobita

総合スコア66

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2018/10/05 02:50

編集2018/10/05 05:41

Python

1 2#input()から入力されて、リストに追加したすべてのデータ(入力順) 3mm = [[8, 10], [7, 6], [8, 4]] 4 5 6#mmの入力されたデータの中からあるき順によりlのリストに使いされたもの 7l = [[7, 6], [8, 4]] 8 9 10 11

上記のようなリストがあるときに、lのリストで、[7,6] [8,4]と二つの要素で、 各左側の数字の大小をくらべ、大きいものの入力番号を出力したいです。
また、左側の数字が複数同じものがある場合は、先に入力された番号を返すプログラムを考えているのですが、sort()等をしようしてもうまくいきません。
アドバイスをお願いします。

上記のリストでは出力が lの大きいものは [8,4]なので、mmでみると3番目に入力されているので、3と出力されるといった感じです。

下記私が書いたコードです。

Python

1#入力数と許容範囲等 2n = input().split() 3n = [int(i) for i in n] 4han_1 = n[1] - n[2] 5han_2 = n[1] + n[2] 6 7mm = [] 8point = [] 9ooo = 0 10for j in range(n[0]): 11 12 #調べる 13 k = input().split() 14 k = [int(l) for l in k] 15 mm.append(k) 16 if han_1 <= k[1] <= han_2: 17 18 point.append(k) 19 ooo += 1 20 21 22 23if ooo == 0: 24 print("not found") 25 26else: 27 l = max(point,key=lambda x:x[0]) 28 for x in mm: 29 if l == x[0]: 30 break 31 32 print(mm.index(l)+1) 33 34 35 36

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

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

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

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

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

guest

回答1

0

ベストアンサー

key引数を指定すれば左側の要素を使った比較を行えます。

python

1>>> sorted([(0,"hoge"), (2,"piyo"), (1,"fuga")], key=lambda x:x[0]) 2[(0, 'hoge'), (1, 'fuga'), (2, 'piyo')] 3

これはlistのsort()メソッド、min(), max()関数等でも同じ仕様で使えます。


やりたいこと的には、ソートをする必要はないでしょう。使えという指示があるような問題なら別ですが。

最大値の探索なので、線形探索で十分。まず最大値を求め、一回ループを回して重複がないか検査すれば良いです。

投稿2018/10/05 03:31

hayataka2049

総合スコア30933

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

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

nobita

2018/10/05 04:13

回答ありがとうございます。 lのリストの中から最大値を求めてその数値と重複がないかをlリストの中でループを回せばいいんでしょうか?
hayataka2049

2018/10/05 04:32

そうですね あとは「先に入力された番号」がリストの前の方(indexが0に近い方)にある要素、ということを指しているなら、単に最大値と一致したら値をとってbreak、でも良いと思います
nobita

2018/10/05 04:59

a = max(l) for i in mm: if i in a: print(mm.index(i)) という感じでしょうか?本格的に始めたのが一か月前で、初歩過ぎてあきれてしまうかもしれませんがお願いいたします
hayataka2049

2018/10/05 05:02

a = max(l) for x in mm:   if a == x[0]:     break みたいな感じですかね
nobita

2018/10/05 05:18

''' #入力数と許容範囲等 n = input().split() n = [int(i) for i in n] han_1 = n[1] - n[2] han_2 = n[1] + n[2] mm = [] point = [] ooo = 0 for j in range(n[0]): #調べる k = input().split() k = [int(l) for l in k] mm.append(k) if han_1 <= k[1] <= han_2: point.append(k) ooo += 1 if ooo == 0: print("not found") else: l = max(point) for x in mm: if l == x[0]: break print(mm.index(l)) '''
nobita

2018/10/05 05:19

こんな感じですか?
hayataka2049

2018/10/05 05:20

コメント欄だとインデントが潰れているのでほとんど読めないのですが、key引数を使っていないようですが? あと、print(mm.index(l))はなにがしたいのかよくわかりません
nobita

2018/10/05 05:40

調べるで、pointに追加された要素が、mmの何番目にあるかを出力したいので、それを記述したつもりだったのですが、。
nobita

2018/10/05 05:41

追記でコードを書き換えました。
hayataka2049

2018/10/05 05:52

ごめんなさい、x[0]の[0]は不要で単にa==xで良かったです
nobita

2018/10/05 07:08

いえいえ!!! 無事に回答が導きだせました!! ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問