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

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

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

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

Q&A

解決済

2回答

430閲覧

Python3でソート

unser

総合スコア58

Python 3.x

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

0グッド

0クリップ

投稿2020/03/04 12:18

3つの文字をsortしたいです。

Python3

1input_line = input().rstrip().split(' ') 2p1 = int(input_line[0]) 3p2 = int(input_line[1]) 4p3 = int(input_line[2]) 5 6def swap(x,y): 7 x,y = y,x 8 9def sort3(x,y,z): 10 if(x > y): 11 print('x > y 1') 12 x,y = y,x 13 #swap(x,y) 14 if(y > z): 15 print('y > z') 16 y, z = z,y 17 #swap(y,z) 18 if(x > y): 19 print('x > y 2') 20 x,y = y,x 21 #swap(x,y) 22 23sort3(p1,p2,p3) 24 25print(p1) 26print(p2) 27print(p3) 28

これでは何も変わりません。どのような修正を行えばよろしいでしょうか。

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

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

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

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

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

guest

回答2

0

ベストアンサー

Pythonでは、文字列や数値はイミュータブルなオブジェクトとなりますので、
それらは関数内で変更しても変更が引き継がれません。
一方、リストはミュータブルなオブジェクトなので、関数内で変更すると値が変わります。

以下のページを参考にして実際に確かめてみるとよいと思います!
参考:https://www.javadrive.jp/python/userfunc/index3.html#section2

したがって、修正方法は以下の2パターンがあります。
[修正方法1]
sort3関数の最後にreturn x,y,zを入れて、p1,p2,p3 = sort3(p1,p2,p3)と関数の結果を入れなおす。
[修正方法2]
3つの数値を一度リストp_list=[p1,p2,p3]として、sort3(p_list)として使えば、returnなしでもリスト内の値が変わるので結果はソートされて出てきます。

前者は現状のソースコードからの変更が少ないので、わかりやすくスッキリしています。
後者はfor文を使ってソートするようにするとソートしたい数値が多くなってもそのまま動きます。
したがって、入力が3つのままであれば前者、入力が増えるかもしれない場合は後者を使用するのが良いです。

投稿2020/03/04 13:22

Matsui_hero

総合スコア346

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

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

LouiS0616

2020/03/04 14:26 編集

1. Pythonには参照渡しはありません。https://docs.python.org/ja/3/faq/programming.html#how-do-i-write-a-function-with-output-parameters-call-by-reference 2. イミュータブル/ミュータブルの違いはこの場合直接的な原因ではありません。ただし、『ミュータブルなオブジェクトの場合はインプレースな操作ができ、呼び出し元にも影響する』のは事実です(事実と言うより定義と言った方が正確な気もしますが)。
guest

0

こうですかね。

python

1input_line = input().rstrip().split(' ') 2p1,p2,p3,*_ = sorted(map(int, input_line)) 3print(p1) 4print(p2) 5print(p3)

投稿2020/03/04 14:05

編集2020/03/04 14:14
kairi003

総合スコア1330

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

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

LouiS0616

2020/03/04 14:11

質問を見る限り p1 = int(input_line[0]) などと数値への変換が見受けられますので、『3つの文字をsortしたい』と書いてあっても実際にソートしたいのは数値かと思われます。
kairi003

2020/03/04 14:15

そのようですね。intにしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問