2023年7月26日水曜日

熟練した python プログラマの方にお聞きしたいのですが、リストとタプルをどのくらいの頻度比率で使うでしょうか?体感・概数で結構です。

https://jp.quora.com/%E7%86%9F%E7%B7%B4%E3%81%97%E3%81%9F-python-%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%81%AE%E6%96%B9%E3%81%AB%E3%81%8A%E8%81%9E%E3%81%8D%E3%81%97%E3%81%9F%E3%81%84%E3%81%AE%E3%81%A7%E3%81%99%E3%81%8C-

並べ替え
 · 
フォロー

Pythonに限らず、C++/Rust/Go/Javaなどの他の言語でもプログラムを書く際には必ず使います。具体的な頻度については書く内容にもよるので一概にも言えませんが、関数単位でみると90%以上の確率で使っています。

用途は以下の回答に書いてある通りです。

杜 世橋
 · 6月16日
Pythonのタプルとリストの違いとは何ですか?
タプルはimmutableでリストはmutableというのはもちろんあるのですが、それよりも用途が異なると考えたほうがいいでしょう。私は常に以下のように意識して両者を使い分けています。 リストは配列と同じで同じ種類の変数を出し入れするためのデータ構造です。 一方でタプルは異なる種類の変数を1つにまとめるために使うものです。例えば関数から複数の値をreturnするとか。また、タプルはhashableなので辞書のキーに使ったりもできます。sortをする際に複数の値を組み合わせたキーを作りたいときにもタプルで一発でできます。 このように考えるとC++のVectorとTupleとの整合性も取れてpybind11などのツールを非常にスムーズに使用できます。

JavaやGoは標準ではタプルが無いので以下の回答のようにGenericsを使用して自分で定義しておきます。

杜 世橋
 · 7ヶ月
何故Go言語にはタプルが存在しないのですか?Rustには存在していますが。
C++やPythonでのタプルの主な用途は複数の型が異なるデータをまとめるというものです。そしてまとめたものを関数の戻り値にしたり、リストに入れたり、辞書のキーにしたりします。これはよく考えてみれば都度構造体を定義すれば原理的には同じことができます。つまりタプルはシンタックスシュガーなのです。 Goは仕様が複雑化する既存の言語に対するアンチテーゼであり、シンプルさを重視している ので同じ機能は一つの方法で実現すればよく、シンタックスシュガーなどは極力排除しているのだと思います。ただ、関数の戻り値の用途だけはよく使うので機能として実装しているのかもしれません。 なお、Go 1.18から導入されたGenericsを使うとタプルを定義することができます。 type Tuple2[T1, T2 any] struct { V1 T1 V2 T2 } これは同じく言語仕様にTupleが無いJavaでGenericsを利用してTupleを定義するのと全く同じ方法です。 Rustとの比較は特に意味がないです。Goは別にRustを参考に作られた言語ではなく、両者は独立に開発されました。

そしてこの回答にも書いてある通り、タプルは結局は構造体を即席で作るためのシンタックスシュガーであり、多用すると変数の意味が分かりにくくなるのである程度要素が増えたり入れ子になってくる場合には専用の構造体/クラスを作り、要素をインデックス番号でなく名前でアクセスできるようにするべきです。私はたいていは2階層になるか、あるいは要素が4つを超えてくる場合は専用構造体を作ります。


PythonのWeb上の記事などによくタプルとリストの比較としてimmutableかどうかがよく書かれていますが、はっきり言ってこれはミスリードであり、他の言語を書いてみるとそもそもタプルとリストの比較なんて出てこないことがすぐにわかります。リストは同じ型の複数のオブジェクトを入れておくコンテナ/データ構造であり、タプルは異なってもいい複数のオブジェクトをまとめておく即席構造体

… (もっと読む)
 · 
フォロー

chatgptに聞くとほとんど解決しちゃう世の中になってきましたね

私は昔は業務でpythonを利用していたときは、辞書のキーとして使うとき以外はすべてリストで扱っていました。

現在は主にkotlin利用していますが、基本的に変数はval(再代入不可変数)リストやハッシュなどはimmutableにしています。後で変更が必要になる場合は、オブジェクトをコピーして再代入することが多いです。

pythonではリストとタプル以外に変更不可にする方法がないので、それほど気にしなくてもいいかもしれません。

デフォルトが変更不可な言語は後で読むのがとても楽です。

 · 
フォロー

質問者です。「熟練した」は余分だったかと反省しています (^_^;

ノービスの python プログラマである私は、正直タプルのありがたみをあまり感じていないので、実アプリを開発している方々はどんなものなのかしら、と思って質問をたててみました。

ちなみに ChatGPT さんに聞いてみたらこんな感じでした。

タプルのベストプラクティス - A ShareGPT conversation
This is a conversation between a human and a GPT-3 chatbot. The human first asks: python のタプルはどのようなときに用いるのがベストプラクティスでしょうか?. The GPT-3 chatbot then responds: Pythonのタプルは以下のような場面で最適に使用することができます:不変なデータの格納:タプルは不変(immutable)なので、内容が変更されるべきでないデータを安全に格納するために使用できます。例えば、ある関数が複数の値を返すとき、それらの値はタプルとしてまとめられます。これにより、関数の呼び出し元は返された値を変更することができません。辞書のキーとして:辞書のキーとしては変更不能な型を使用する必要があります。そのため、タプルは辞書のキーとして利用可能です。順序の保証:リストと違ってタプルは不変です。そのため、順序が重要な場合(例えば、日付を表す(年, 月, 日)のようなデータ)にタプルを使用すると良いです。パフォーマンス:タプルはリストに比べてメモリ効率が良く、処理速度も速いです。大量のデータを扱い、そのデータが不変である場合、タプルを使用するとパフォーマンスの向上が期待できます。データの保護:関数がタプルを返すとき、それは返されたデータが不変であるべきだという暗黙の契約を示します。このように、タプルを使うことでデータの安全性を高めることができます。ただし、タプルの主な特徴はその不変性です。そのため、内容が変更される可能性のあるデータにはリストなど他のデータ型を使用する方が適しています。

0 コメント:

コメントを投稿