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

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

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

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

Q&A

解決済

2回答

3686閲覧

lambda pair: pair[1]の[1]について

mochikko

総合スコア1

Python 3.x

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

0グッド

0クリップ

投稿2021/08/08 03:45

前提・実現したいこと

O'REILLYオーラリージャパン発行 「Pythonチュートリアル 第3版」 P36 4.7.5 lamnda(ラムダ)式
の中で
pair[1] が、なぜ'one','two','three','four'を取り出すことになるのかわかりません。

以下動作です

pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]#リスト pairs.sort(key=lambda pair: pair[1]) pairs

pair[1]というコードがなぜindex1の要素を取り出すのか

上記の動作結果は以下の通りです。

[(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]

この結果を見ると
sort(key=lambda pair: pair[1])
で、仮引数に'one','two','three','four'を取り出し、それをsortするためのkeyとしてるのだと思いますが
なぜpair[1]で'one','two','three','four'が取り出せるのかわかりません。
リスト[インデックス]という形だったら(2, 'two')が取り出されてしまうように思うのですが。。。

試したこと

リスト[インデックス]はその番号の要素を取り出すのだと思うので、
試しに
pairs[1]を出力したら
(2, 'two')
となりました。

補足情報

プログラミング経験ゼロの全くの初心者です。
IT用語にも詳しくないですし質問の説明自体がわかりづらいかもしれません。。。
全くの勘違いをしている可能性大ですが、
でも、納得したいので、ぜひどなたかよろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

lamnda式と、sortのkyeで指定する関数は、別の問題であることを理解しましょう。

今回の疑問はlamnda式の問題ではなく、sortのkyeで指定する関数に渡される引き数の問題です。

まず、lambda式は関数を返す式です。key=の部分には、関数を書くのでlambda式を書くことができますが、defで定義した関数を書くこともできます。

pairs.sort(key=lambda pair: pair[1])

をlambda式ではなく関数を使って書くと以下のようになります。

python

1def get_right(x): 2 return x[1] 3 4pairs.sort(key=get_right)

実行してみると、どちらも同じであることがわかります。

python

1>>> def get_right(x): 2... return x[1] 3... 4>>> pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]#リスト 5>>> pairs.sort(key=get_right) 6>>> print(pairs) 7[(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]

では、関数get_rightにデバッグ用のprint文を追加してみましょう。

python

1def get_right(x): 2 print("x = ", x) 3 return x[1]

これを実行してみると以下のようになります。

python

1>>> def get_right(x): 2... print("x = ", x) 3... return x[1] 4... 5>>> pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]#リスト 6>>> pairs.sort(key=get_right) 7x = (1, 'one') 8x = (2, 'two') 9x = (3, 'three') 10x = (4, 'four') 11>>> print(pairs) 12[(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]

get_rightに渡ってくる引き数はpairsではなく、(1, 'one')や(2, 'two')なのです。
これはlambda式であるかどうかは関係なく、sort関数のkey引き数の仕様です。

こういう場合のkeyの仕様については、

Pythonのsorted()やmax()などで引数keyを指定

をお読みください。

投稿2021/08/08 04:16

ppaul

総合スコア24670

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

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

mochikko

2021/08/09 01:45

ご丁寧にありがとうございます。お返事が遅くなっていて申し訳ありません。 いま一つ一つ紐解いていっている最中でございます。。。! わかった時点で、もしくはまた質問が出てきましたらコメントいたします。
ppaul

2021/08/09 02:49

厳密な説明ではなく、大雑把に考えるのであれば、以下のようになります。 ソート関数は、まず引数のリストlist_to_sortに対して、keyで与えられた関数funcを使って keylist = [] for element in : keylist.appne(func(element)) をやります。 そのあとでkeylistともとのリストlist_to_sortを同時に並べ替え処理をします。 keylistを作る処理はfor文をつくるのと同じなので、funcの引数にはlist_to_sortではなくその要素である各elementが渡ってくるのです。
guest

0

pairpairsは別の変数です。よく見ましょう。

pairは、ソートキーを決めるコールバック関数の引数なので、ソート対象の要素つまり、pairs[0]pairs[1]pairs[2]pairs[3]が入ります。
pair[1]というのはつまりpairs[0][1]pairs[1][1]pairs[2][1]pairs[3][1]です。

投稿2021/08/08 03:58

otn

総合スコア85901

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

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

mochikko

2021/08/08 04:30

otn様、早速のご回答ありがとうございます。 pairは変数pairsと違ってlambda式の仮引数だということはわかっていたのですが [ ]の意味として変数+[ ]の使い方と混同して考えていました。 変数の後につく[ ]と引数のあとにつく[ ]は意味が違うという解釈でよろしいでしょうか。 変数の後につく[ ]はリストの要素を取り出すけれど、 引数のあとにつく[ ]はそれぞれの要素の中での要素番号1を取り出す こういうことでしょうか?
otn

2021/08/08 04:43

> 変数の後につく[ ]と引数のあとにつく[ ]は意味が違うという解釈でよろしいでしょうか。 引数も変数の一種なので、意味は同じです。 変数の中に入っている物によって、変数[1] の値は違います。 変数の中身が、 [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')] だと、[1]は(2, 'two')だし、 変数の中身が、(1, 'one')だと、[1]は 'one' です。
otn

2021/08/08 04:44

回答の内容を、意味がわかるまで読み直しましょう。
mochikko

2021/08/08 05:03

ありがとうございます。何度も読んでみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問