web-dev-qa-db-ja.com

Pythonでは、辞書、リスト、またはセットをいつ使用するか

辞書、リスト、またはセットを使用するのはいつですか。

各データタイプにより適したシナリオはありますか?

274
Blankman

listは秩序を保ち、dictsetはしません。したがって、秩序を気にするときは、listを使用する必要があります(もちろん、コンテナの選択がこれら3つに限定されている場合は;-)。

dictは各キーに値を関連付けますが、listsetは単に値を含むだけです。明らかにユースケースは大きく異なります。

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

setは重複を禁止し、listは禁止します。これも重要な違いです。 (重複を複数回存在するアイテムの異なる数にマップする "multiset"はcollections.Counterで見つけることができます - 奇妙な理由でdictをインポートできない場合はcollectionsとして作成できます。 2.7より前のcollections.defaultdict(int)としてのPython、キーとしてアイテムを、カウントとして関連付けられた値を使用します。

set(またはキーの場合はdict)内の値のメンバーシップをチェックするのは非常に高速です(ほぼ一定の短時間を要します)が、リスト内では平均的な場合と最悪の場合リストの長さに比例した時間がかかります。それで、もしあなたがハッシュ可能なアイテムを持っていて、順番や重複についてどちらの方法も気にせず、そして迅速なメンバーシップチェックを望むなら、setlistより優れています。

578
Alex Martelli
  • あなたはただアイテムの順序付けられたシーケンスが必要ですか?リストに行きます。
  • あなたはすでにgot特定の値を持っているのかどうかを知る必要があるのですが、順序付けする必要はありません(そして重複を保存する必要はありません)。セットを使用してください。
  • 値をキーに関連付ける必要があるので、後で(キーで)効率的に値を調べることができますか?辞書を使う。
155
Jon Skeet
  • 値にマップする一連の固有キーがある場合は辞書を使用してください。

  • 注文した商品のコレクションがある場合は、リストを使用してください。

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

18
SLaks

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

要素の不変の順序付きリストを収集したい場合は、Tupleを使用してください。 (例えば、(name、phone_number)の組を集合の要素として使いたい場合、集合は要素を不変にする必要があるので、リストではなくTupleが必要になります)。

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

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

17
unutbu

これはsetsを網羅していませんが、dictsとlistsの良い説明です。

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

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

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

5
Goose

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

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
DummyHead

要するに、以下を使用します。

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]])-xの最初のlのインデックス(iの前後、およびjの前)

リストには、すべての可変シーケンス操作も実装されます。

  • l[i] = x-iのアイテムlxに置き換えられます
  • l[i:j] = t-liからjへのスライスは、反復可能な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-ltの内容で拡張します
  • l *= n-lの内容をn回繰り返して更新します
  • l.insert(i, x)-xで指定されたインデックスでliを挿入します
  • l.pop([i])-iのアイテムを取得し、lからも削除します
  • l.remove(x)-lから最初の項目を削除します(l[i]はxと等しい)
  • l.reverse()-所定の位置にあるlのアイテムを反転します

リストは、appendメソッドとpopメソッドを利用してスタックとして使用できます。

辞書

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

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

設定

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

1
lmiguelvargasf

リストdictsおよび集合と組み合わせると、もう1つ興味深いことがあります。 pythonオブジェクト、 OrderedDicts

順序付き辞書は通常の辞書とまったく同じですが、項目が挿入された順序を覚えています。順序付き辞書を反復処理するとき、項目はキーが最初に追加された順序で返されます。

OrderedDictsは、キーの順序を保持する必要がある場合、たとえばドキュメントを扱う場合に便利です。ドキュメント内のすべての用語のベクトル表現が必要な場合が一般的です。そのため、OrderedDictsを使用すると、用語の前に読んだことがあるかどうかを効率的に確認し、用語を追加し、用語を抽出します。

0
Federico Caccia

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

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

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

0

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

Pythonについて留意する必要があるのは、次のとおりです。C++の場合のようなPython標準はありません。そのため、Pythonインタプリタ(CPython、PyPyなど)によって大きな違いがあるかもしれません。次のフローチャートはCPython用です。

さらに、bytesbyte arraystuplesnamed_tuplesChainMapCounter、およびarraysのようなデータ構造をダイアグラムに組み込むための良い方法が見つかりませんでした。

  • OrderedDictdequecollectionsモジュールを通して利用できます。
  • heapqheapqモジュールから入手できます
  • LifoQueueQueue、およびPriorityQueueは、同時(スレッド)アクセス用に設計されたqueueモジュールを介して使用できます。 (利用可能なmultiprocessing.Queueもありますが、queue.Queueとの違いはわかりませんが、プロセスからの同時アクセスが必要な場合に使用することを想定しています。)
  • dictsetfrozen_set、およびlistはもちろん組み込まれています

あなたがこの答えを改善し、あらゆる面でより良い図表を提供することができれば誰にとっても私は感謝するでしょう。お気軽にどうぞ。 flowchart

シモンズ:図はyedで作られています。 graphmlファイル こちらです

0
math