Pythonでは、いつディクショナリ、リスト、またはセットを使用しますか?


回答:


603

A listは順序を維持しdictsetしない:順序を気にする場合は、使用する必要がありますlist(もちろん、コンテナーの選択がこれら3つに限定されている場合は、;-)。

dict各キーのA値を持つ仲間が、一方でlistset明らかに、非常に異なる使用例:ちょうど値が含まれています。

setアイテムはハッシュ可能である必要がありますが、ハッシュ可能でlistはありません。ハッシュ可能でないアイテムがある場合は、使用できずset、代わりにを使用する必要がありますlist

set重複を禁止します。禁止listしません。これも重要な違いです。(重複を複数のアイテムの異なる数にマッピングする「マルチセット」はにありますcollections.Counter- dict何らかの理由でインポートできなかった場合collections、または2.7より前のバージョンでは、として作成できます。Pythonをとしてcollections.defaultdict(int)、アイテムをキーとして使用し、関連する値をカウントとして使用します)。

a set(またはdict、キーの)の値のメンバーシップのチェックは非常に高速です(一定の短い時間を要します)。一方、リストでは、平均および最悪の場合、リストの長さに比例して時間がかかります。したがって、ハッシュ可能なアイテムがある場合、順序や重複を気にせず、迅速なメンバーシップチェックが必要な場合setは、よりも優れていlistます。


6
Python 3.7はデフォルトでdictが注文されていることに注意してください
Gigi Bayte 2

172
  • 注文したアイテムのシーケンスが必要ですか?リストに行きます。
  • あなたはちょうどあなたがすでにきたかどうかを知っておく必要があります得ました特定の値を、しかし、発注せずに(そして、あなたは店の重複する必要はありませんか)?セットを使用してください。
  • 後で値を効率的に(キーで)参照できるように、キーに値を関連付ける必要がありますか?辞書を使う。

30
これは、アレックスM.による上記の回答の「TL; DR」部分である必要があります。:-)
Alex Boschmans '23

9
アレックスはジョンに投票を寄付する必要があります。この回答はほとんどすべてをカバーしており、はるかに簡潔で明確です。
メフメット2016年

ただし、これらのデータ型の間の時間の複雑さの違いを知りたい場合はアレックスの説明がうまく機能
kcEmenike

19

一意の要素の順序付けられていないコレクションが必要な場合は、を使用しsetます。(たとえば、ドキュメントで使用されるすべての単語のセットが必要な場合)。

要素の不変の順序付きリストを収集する場合は、を使用しtupleます。(たとえば、セットの要素として使用したい(name、phone_number)ペアが必要な場合、セットには要素が不変であるため、リストではなくタプルが必要になります)。

要素の変更可能な順序付けされたリストを収集する場合は、を使用しlistます。(たとえば、リストに新しい電話番号を追加する場合:[number1、number2、...])。

キーから値へのマッピングが必要な場合は、を使用しdictます。(たとえば、名前を電話番号にマップする電話帳が必要な場合:) {'John Smith' : '555-1212'}。辞書のキーは順序付けされていないことに注意してください。(辞書(電話帳)を反復処理する場合、キー(名前)が任意の順序で表示されることがあります)。


ええと、彼はタプルについて尋ねませんでした。
habnabit 2010

18
  • 値にマップする一意のキーのセットがある場合は、辞書を使用します。

  • 注文したアイテムのコレクションがある場合は、リストを使用します。

  • セットを使用して、順序付けられていないアイテムのセットを格納します。


6

要するに、使用:

list -注文したアイテムのシーケンスが必要な場合。

dict -値をキーに関連付ける必要がある場合

set -固有の要素を保持する必要がある場合。

詳細説明

リスト

リストは変更可能なシーケンスであり、通常、同種のアイテムのコレクションを格納するために使用されます。

リストは、すべての一般的なシーケンス操作を実装します。

  • x in l そして x not in l
  • l[i]l[i:j]l[i:j:k]
  • len(l)min(l)max(l)
  • l.count(x)
  • l.index(x[, i[, j]])-第1回発生した指数xl(またはそれ以降にiと前jindeces)

リストは、すべての変更可能なシーケンス操作も実装します。

  • l[i] = x-アイテムil置き換えられますx
  • l[i:j] = t-のスライスlからij反復可能な内容に置き換えられますt
  • del l[i:j] - と同じ l[i:j] = []
  • l[i:j:k] = t -の要素 l[i:j:k]t
  • del l[i:j:k] -の要素を削除します s[i:j:k]リストから
  • l.append(x) -追加 xシーケンスの最後にします
  • l.clear() -からすべてのアイテムを削除します l(delと同じl[:]
  • l.copy() -の浅いコピーを作成します l(と同じl[:])の
  • l.extend(t)またはl += t-拡張lの内容でt
  • l *= n -アップデート lの内容とは、繰り返しn
  • l.insert(i, x)-挿入xl指定れたインデックスにますi
  • l.pop([i])-でアイテムを取得し、iそこからも削除しますl
  • l.remove(x)-最初のアイテムをlどこから削除するl[i]-xに等しい
  • l.reverse()-の項目を反転させるl場所で

メソッドを利用してリストをスタックとして使用しappendpop

辞書

辞書はハッシュ可能な値を任意のオブジェクトにマッピングします。辞書は変更可能なオブジェクトです。辞書の主な操作は、キーを使用して値を格納し、キーを指定して値を抽出することです。

ディクショナリでは、ハッシュ化できない値、つまり、リスト、ディクショナリ、またはその他の変更可能なタイプを含む値をキーとして使用できません。

セットする

セットは、個別のハッシュ可能なオブジェクトの順序付けられていないコレクションです。セットは通常、メンバーシップテスト、シーケンスからの重複の削除、交差、和集合、差、対称差などの数学演算の計算に使用されます。


5

これはsetsをカバーしていませんが、dictsとlistsの良い説明です:

リストとは、見た目、つまり値のリストです。それぞれにゼロから番号が付けられます-最初の番号はゼロ、2番目の1、3番目の2などの番号が付けられます。リストから値を削除し、最後に新しい値を追加できます。例:たくさんの猫の名前。

辞書は、その名前が示唆するものに似ています-辞書。辞書には、単語の「インデックス」があり、それぞれに定義があります。Pythonでは、単語は「キー」と呼ばれ、定義は「値」と呼ばれます。辞書の値には番号が付けられていません-その名前が示唆するものに似た風袋-辞書。辞書には、単語の「インデックス」があり、それぞれに定義があります。辞書の値には番号が付けられていません-それらは特定の順序にもありません-キーは同じことをします。辞書の値を追加、削除、変更できます。例:電話帳。

http://www.sthurlow.com/python/lesson06/


4

C ++の場合、私は常にこのフローチャートを念頭に置いていました。どのシナリオで特定のSTLコンテナーを使用しますか?なので、Python3でも同様のものが利用できるかどうか知りたくてたまらなかった。

Pythonについて覚えておく必要があるのは、C ++のように単一のPython標準がないことです。したがって、異なるPythonインタープリター(CPython、PyPyなど)には大きな違いがある可能性があります。次のフローチャートはCPython用です。

:さらに、私は、ダイアグラムに次のようなデータ構造を組み込むための良い方法を発見したbytesbyte arraystuplesnamed_tuplesChainMapCounter、とarrays

  • OrderedDictおよびdeque経由で利用可能ですcollectionsモジュール。
  • heapq から入手可能です heapqモジュールです
  • LifoQueueQueue、およびPriorityQueueを介して利用可能であるqueue同時(スレッド)のアクセスのために設計されたモジュール。(multiprocessing.Queue利用可能なものもありますが、違いはわかりませんが、queue.Queueプロセスからの同時アクセスが必要な場合に使用する必要があると想定しています。)
  • dictsetfrozen_set、そしてlistもちろんビルトインされています

誰にとっても、この答えを改善し、あらゆる面でより良い図を提供していただければ幸いです。お気軽にどうぞ。 フローチャート

PS:ダイアグラムはyedで作成されています。graphmlファイルはこちら


3

リスト辞書セットと組み合わせて、別の興味深いPythonオブジェクトであるOrderedDictsもあります。

順序付き辞書は通常の辞書と同じですが、アイテムが挿入された順序を記憶しています。順序付けされたディクショナリを反復する場合、項目は、キーが最初に追加された順序で返されます。

OrderedDictsは、ドキュメントの操作など、キーの順序を維持する必要がある場合に役立ちます。ドキュメント内のすべての用語のベクトル表現が必要になることはよくあります。したがって、OrderedDictsを使用すると、用語が以前に読み込まれたかどうかを効率的に確認し、用語を追加し、用語を抽出し、すべての操作の後に、それらの順序付けられたベクトル表現を抽出できます。


1

リストとは、見た目、つまり値のリストです。それらのそれぞれにゼロから番号が付けられます-最初のものはゼロ、2番目の1、3番目の2などの番号が付けられます。リストから値を削除し、最後に新しい値を追加できます。例:たくさんの猫の名前。

タプルはリストと同じですが、値を変更することはできません。最初にそれをあきらめる値は、プログラムの残りの部分で行き詰まっている値です。ここでも、参照しやすいように、各値にはゼロから番号が付けられています。例:年の月の名前。

辞書は、その名前が示唆するものに似ています-辞書。辞書には、単語の「インデックス」があり、それぞれに定義があります。Pythonでは、単語は「キー」と呼ばれ、定義は「値」と呼ばれます。辞書の値には番号が付けられていません-その名前が示唆するものに似た風袋-辞書。辞書には、単語の「インデックス」があり、それぞれに定義があります。Pythonでは、単語は「キー」と呼ばれ、定義は「値」と呼ばれます。辞書の値には番号が付けられていません-それらは特定の順序にもありません-キーは同じことをします。辞書の値を追加、削除、変更できます。例:電話帳。


1

それらを使用するとき、私はあなたの参照のためにそれらの方法の徹底的なチートシートを作ります:

class ContainerMethods:
    def __init__(self):
        self.list_methods_11 = {
                    'Add':{'append','extend','insert'},
                    'Subtract':{'pop','remove'},
                    'Sort':{'reverse', 'sort'},
                    'Search':{'count', 'index'},
                    'Entire':{'clear','copy'},
                            }
        self.tuple_methods_2 = {'Search':'count','index'}

        self.dict_methods_11 = {
                    'Views':{'keys', 'values', 'items'},
                    'Add':{'update'},
                    'Subtract':{'pop', 'popitem',},
                    'Extract':{'get','setdefault',},
                    'Entire':{ 'clear', 'copy','fromkeys'},
                            }
        self.set_methods_17 ={
                    'Add':{['add', 'update'],['difference_update','symmetric_difference_update','intersection_update']},
                    'Subtract':{'pop', 'remove','discard'},
                    'Relation':{'isdisjoint', 'issubset', 'issuperset'},
                    'operation':{'union' 'intersection','difference', 'symmetric_difference'}
                    'Entire':{'clear', 'copy'}}

1

辞書:Python辞書は、インデックスとしてのキーと値としてのオブジェクトを持つハッシュテーブルのように使用されます。

リスト:リストは、配列内のオブジェクトの位置によってインデックスが付けられた配列内のオブジェクトを保持するために使用されます。

セット:セットは、オブジェクトがセット内に存在するかどうかを判別できる関数を含むコレクションです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.