web-dev-qa-db-ja.com

Pythonで辞書vsタプルを使用する場合

具体的な例として、ファイル名とそのサイズのリストがあります。リストの各項目を{"filename": "blabla", "size": 123}の形式にするか、("blabla", 123)の形式にするかを決定できません。たとえば、file["size"]の方がfile[1]よりもわかりやすいので、辞書のほうが論理的に思えます。考え?

31
clb

私はnamedtupleを使用します:

from collections import namedtuple
Filesize = namedtuple('Filesize', 'filename size')
file = Filesize(filename="blabla", size=123)

これで、プログラムでfile.sizeおよびfile.filenameを使用できるようになりました。これは、最も読みやすい形式のIMHOです。注namedtupleは、タプルなどの不変オブジェクトを作成します ここ で説明されているように、これらは辞書よりも軽量です。

78
Doc Brown

{"ファイル名": "blabla"、 "size":123}、または単に( "blabla"、123)

これは、フォーマット/スキーマをインバンドでエンコードするか、アウトオブバンドでエンコードするかという昔からの問題です。

一部のメモリをトレードオフして、データの形式をデータ内で正しく表現することから得られる可読性と移植性を取得します。これを行わない場合、最初のフィールドはファイル名であり、2番目のフィールドはサイズであることを別の場所に保持する必要があります。これはメモリを節約しますが、可読性と移植性が犠牲になります。あなたの会社にもっとお金がかかるのはどれですか?

不変の問題については、不変が変更に直面して役に立たないことを意味しないことを忘れないでください。つまり、より多くのメモリを取得し、コピーに変更を加え、新しいコピーを使用する必要があります。それは無料ではありませんが、多くの場合、取引のブレーカーではありません。常に変更するために不変文字列を使用します。

別の考慮事項は拡張性です。エンコード形式情報なしでデータを位置的にのみ保存すると、単一の継承のみが要求されます。これは、確立されたフィールドの後に追加のフィールドを連結するという習慣に他なりません。 3番目のフィールドを作成日として定義し、1番目と2番目を同じように定義するため、フォーマットと互換性があります。

しかし、私ができないことは、重複するフィールドがある2つの個別に定義されたフォーマットを1つにまとめ、それらを1つのフォーマットに格納し、1つまたは他のフォーマットについてのみ知っていることに役立つことです。

そのためには、最初からフォーマット情報をエンコードする必要があります。 「このフィールドはファイル名です」と言う必要があります。そうすることで、多重継承が可能になります。

オブジェクトのコンテキストでのみ表現される継承に慣れているかもしれませんが、オブジェクトはデータ形式で格納されるため、同じアイデアがデータ形式でも機能します。まったく同じ問題です。

したがって、必要と思われる方を使用してください。正当な理由を指摘できない限り、私は柔軟に対応します。

18
candied_orange

2つのプロパティを持つクラスを使用します。 file.sizeはどちらよりも優れていますfile[1]またはfile["size"]

シンプルは複雑よりも優れています。

7
JacquesB

ファイル名は一意ですか?もしそうなら、あなたはリストを完全にスクラップして、すべてのファイルに純粋な辞書を使用することができます。例えば(架空のWebサイト)

{ 
  "/index.html" : 5467,
  "/about.html" : 3425,
  "/css/main.css" : 9876
}

等...

これで、「名前」と「サイズ」を取得するのではなく、キーと値を使用するだけですが、多くの場合、これはより自然です。 YMMV。

本当に明確にするために「サイズ」が必要な場合、またはファイルに複数の値が必要な場合:

{ 
   "/index.html" : { "size": 5467, "mime_type" : "foo" },
   "/about.html" : { "size": 3425, "mime_type" : "foo" }
   "/css/main.css" : { "size": 9876, "mime_type" : "bar" }
}
5
user949300

Pythonでは、辞書は変更可能なオブジェクトです。反対に、タプルは不変オブジェクトです。

辞書のキー、値のペアを頻繁に、または毎回変更する必要がある場合。使用する辞書を提案します。

固定/静的データがある場合は、タプルを使用することをお勧めします。

# dictionary define.
a = {}
a['test'] = 'first value'

# Tuple define.
b = ()
b = b+(1,)

# here, we can change dictionary value for key 'test'
a['test'] = 'second'

ただし、代入演算子を使用してタプルデータを変更することはできません。

0
Deepen Patel