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

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

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

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

Q&A

解決済

2回答

1490閲覧

pythonのデータ構造におけるタプルパッキングとシーケンスアンパッキング

mau

総合スコア13

Python

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

0グッド

0クリップ

投稿2019/08/15 08:19

平素よりお世話になっております。

現在、pythonの参考書を使ってデータ構造について学んでいるのですが、
ソートをするときにタプルパッキング、シーケンスパッキングたる用語が出てきました。
しかし、自分の理解力が及ばず用語解説が分からなかったので質問させていただきました。
一応、これらの機能を使わず動くソースも作ってみましたが、できることなら上記の方法を理解して使いたいと思います。回答よろしくお願いします。

以下、解説文等を載せます。

右辺が複数の変数からなる代入はタプルパッキングと呼ばれ、自動的にタプルにまとめて代入してくれる機能である。
左辺が複数の変数からなる代入はシーケンスアンパッキングと呼ばれ、右辺のシーケンスオブジェクトの要素を自動的に変数に分けて代入する機能である。
この2つの機能を同時に使うことで複数の代入文を同時に実行できている。

def sort(A): for i in range(0,len(A)-1): select_min(A,i) def select_min(A,i): min = i for j in range(i+1,len(A)): if A[min] > A[j]: min = j A[i] , A[min] = A[min] , A[i] A=[8,4,3,9,6] sort(A) print(A)

そのタプルパッキングとシーケンスアンパッキングを使うことが次の文とのこと
A[i] , A[min] = A[min] , A[i]

以下、個人的な作業したこと
ここで、何が行われているか確認するため次のコードに変更し、数値の入れ替わりを確認しました。

def sort(A): for i in range(0,len(A)-1): select_min(A,i) def select_min(A,i): min = i for j in range(i+1,len(A)): if A[min] > A[j]: min = j print(A[i],A[min]) A[i] , A[min] = A[min] , A[i] print(A[i],A[min]) A=[8,4,3,9,6] sort(A) print(A)

入れ替わりが確認できたため、同じ結果になるコードも作ってみました。

def sort(A): for i in range(0,len(A)-1): select_min(A,i) def select_min(A,i): min = i for j in range(i+1,len(A)): if A[min] > A[j]: min = j z=A[i];A[i]=A[min];A[min]=z A=[8,4,3,9,6] sort(A) print(A)

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

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

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

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

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

hayataka2049

2019/08/15 08:42

なにがわからないのかについて、もう少し掘り下げて書いて頂けませんか? あと、参考にした書籍の名前、著者、出版社、出版年度等と、出典箇所についても記載しておくといいと思います。
mau

2019/08/15 09:25 編集

端的に述べるなら A[i] , A[min] = A[min] , A[i] で、特に何かを代入するように見えないのにリストAの値が変化していること および 「,」の使い方の応用がわかりません。(x,y=1,2→x=1;y=2と同等はわかっている。) なぜこの書き方で 「8,4,3,9,6」→「4,8,3,9,6」 というように扱うことができるのか(文の解釈の仕方)ということです。 ちなみに本は、 書名:Pythonで体験してわかるアルゴリズムとデータ構造 著者:西澤弘毅、森田光 出版日:2018年6月30日初版 出版社:近代科学社
guest

回答2

0

ベストアンサー

python

1A[i] , A[min] = A[min] , A[i]

については、

python

1t1 = A[min] 2t2 = A[i] 3A[min] = t2 4A[i] = t1

と書いても同じなのですが、まずこれはいいでしょうか?

このことを踏まえれば、あとは自然な変換として捉えられると思います。

投稿2019/08/15 09:48

hayataka2049

総合スコア30933

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

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

mau

2019/08/16 04:58

なるほど、そういう動き方をしていたのですね。納得いきました。回答ありがとうございました。
guest

0

Python公式ドキュメントより引用します:

t = 12345, 54321, 'hello!' は タプルのパック(tuple packing) の例です。値 12345, 54321, 'hello!' が一つのタプルにパックされます。逆の演算も可能です:

python

1x, y, z = t

この操作は、シーケンスのアンパック (sequence unpacking) とでも呼ぶべきもので、右辺には全てのシーケンス型を使うことができます。シーケンスのアンパックでは、等号の左辺に列挙されている変数が、右辺のシーケンスの長さと同じ数だけあることが要求されます。複数同時の代入が実はタプルのパックとシーケンスのアンパックを組み合わせたものに過ぎないことに注意してください。

投稿2019/08/15 08:50

yohhoy

総合スコア6191

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問