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

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

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

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

Q&A

解決済

3回答

10230閲覧

入力値から最大値だけを取り出したいです

urazome

総合スコア26

Python 3.x

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

0グッド

0クリップ

投稿2018/09/17 16:51

入力値-------
5
11 14 16 10
12 15 17 10
13 11 14 11
12 10 13 8
11 13 14 10


python3

1num=input() 2x=[] 3y=[] 4for i in range(int(num)): 5 n=input() 6 x.append(n) 7 y.append(max(x[i]))#リストxのそれぞれの要素から最大値を取り出し、リストyに入れる 8print(max(y))#リストyの最大値を取り出す

入力される値の一行目は、二行目以降に何個の入力があるかを表していて、二行目以降の入力から、最大値を取り出そうとしています。17が出力されれば成功です。
そして以上のコードで最大値を取り出せば、成功するかなと考えていたのですが、既にy.append(max(x[i]))の時点で、なぜか一桁目の数値が最大かどうかで判断し、その一桁目だけが出力されました。
どうして入力値の一桁目だけしか考慮されず、そして出力されたのでしょうか?
また、どうしたら入力された値通りの数値を出力できますか?

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

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

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

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

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

guest

回答3

0

問題は、入力を数値ではなく数字列としてデータを扱っていることです。
入力を正しく受け取るのには若干の慣れがいるので、参考になるリンクを貼っておきます。
Qiita - 初心者による超初心者のための競プロの基礎的な入出力(Python3)

まずはこんなデータが作れるようにトライしてみてください。

Python

1>>> print(data) 2[[11, 14, 16, 10], [12, 15, 17, 10], [13, 11, 14, 11], [12, 10, 13, 8], [11, 13, 14, 10]]

さらにdataの各リストを最大値で置き換えるようなコードを書けば、次の値が得られます。

Python

1>>> print(data) 2[16, 17, 14, 14]

あとはmax関数で一発です。


なお、一重リストに潰して一気に最大値を求める方法もあります。
Qiita - ネストしたリストをフラットにする方法

numpyを利用するのも良いアイデアです。

投稿2018/09/17 17:05

編集2018/09/17 17:09
LouiS0616

総合スコア35660

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

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

urazome

2018/09/18 15:16

ありがとうございます!URLもありがとうございます!numpyも一度試したのですが失敗してしまいました。でも、その理由がわかったかもしれないのでもう一度挑戦してきます!
guest

0

ベストアンサー

まず質問コードの出力結果とx[]とy[]の中身でデバックして原因を確認します。

5 11 14 16 10 12 15 17 10 13 11 14 11 12 10 13 8 11 13 14 10 8 print(x) >> ['11 14 16 10', '12 15 17 10', '13 11 14 11', '12 10 13 8', '11 13 14 10'] print(y) >> ['6', '7', '4', '8', '4']

n=input()

n=input()では1行丸ごと文字列としてnへ代入されます。
input()は1行丸ごと読み込みを行います。

x.append(n)

x[]には5回カンマが入っていて、1ループ毎に1行丸ごと文字列として代入されていることが分かります。
1つ前のn1行丸ごと文字列が入っているからです。

y.append(max(x[i]))

ループi=0の例ですとmax(x[0])の中身が'11 14 16 10'なので文字列の最大値'6'になり、y[0]へ代入されます。

print(max(y))

最終的にy[]の中から['6', '7', '4', '8', '4'] 最大値8が出力されます。


原因は①と②で1行丸ごと文字列として代入されていることです。


対策として①でsprit()int()を使い1行を空白で区切って数値として代入しましょう。

@LouiS0616さんの回答にもある 基礎的な入出力 を参考にすると良いでしょう。


⑥が出来たら完成なのでそれ以降の処理に変更が必要になるのでご自分でも考えてみてください。

-以下回答例です-
修正箇所と出力結果の画像

投稿2018/09/17 23:04

編集2018/09/17 23:21
opyon

総合スコア1009

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

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

urazome

2018/09/18 15:13

ありがとうございます!map()の使い方も知ることができたので、嬉しいです!
guest

0

今回の場合は,n * m のリストに対してその中の最大値を求めるので,2重for文で実装してみました.

python

1n = int(input()) 2numbers = [] 3for i in range(n): 4 numbers.append(list(map(int,input().split()))) 5 6max = numbers[0][0] 7 8for i in range(n): 9 for j in range(len(numbers[0])): 10 if max < numbers[i][j]: 11 max = numbers[i][j] 12 13print(max)

投稿2018/09/17 23:45

編集2018/09/17 23:46
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

urazome

2018/09/18 15:18

ありがとうございます!様々なやり方があって、参考になります!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問