辞書、リスト、またはセットを使用するのはいつですか。
各データタイプにより適したシナリオはありますか?
list
は秩序を保ち、dict
とset
はしません。したがって、秩序を気にするときは、list
を使用する必要があります(もちろん、コンテナの選択がこれら3つに限定されている場合は;-)。
dict
は各キーに値を関連付けますが、list
とset
は単に値を含むだけです。明らかにユースケースは大きく異なります。
set
ではアイテムをハッシュ可能にする必要がありますが、list
ではそうではありません。ハッシュ不可能なアイテムがある場合は、set
を使用できず、代わりにlist
を使用する必要があります。
set
は重複を禁止し、list
は禁止します。これも重要な違いです。 (重複を複数回存在するアイテムの異なる数にマップする "multiset"はcollections.Counter
で見つけることができます - 奇妙な理由でdict
をインポートできない場合はcollections
として作成できます。 2.7より前のcollections.defaultdict(int)
としてのPython、キーとしてアイテムを、カウントとして関連付けられた値を使用します。
set
(またはキーの場合はdict
)内の値のメンバーシップをチェックするのは非常に高速です(ほぼ一定の短時間を要します)が、リスト内では平均的な場合と最悪の場合リストの長さに比例した時間がかかります。それで、もしあなたがハッシュ可能なアイテムを持っていて、順番や重複についてどちらの方法も気にせず、そして迅速なメンバーシップチェックを望むなら、set
はlist
より優れています。
値にマップする一連の固有キーがある場合は辞書を使用してください。
注文した商品のコレクションがある場合は、リストを使用してください。
セットを使用して、順序付けされていないアイテムのセットを格納します。
順序付けされていない一意の要素のコレクションが必要な場合は、set
を使用します。 (たとえば、文書内で使用されているすべての単語のセットが必要な場合)。
要素の不変の順序付きリストを収集したい場合は、Tuple
を使用してください。 (例えば、(name、phone_number)の組を集合の要素として使いたい場合、集合は要素を不変にする必要があるので、リストではなくTupleが必要になります)。
可変の順序付けされた要素のリストを収集したい場合は、list
を使用してください。 (たとえば、新しい電話番号をリストに追加したい場合:[number1、number2、...])。
キーから値へのマッピングが必要な場合は、dict
を使用してください。 (たとえば、名前を電話番号に対応付ける電話帳が必要な場合は{'John Smith' : '555-1212'}
)。辞書のキーは順番になっていないことに注意してください。 (辞書(電話帳)を繰り返し使用すると、キー(名前)は任意の順序で表示されます)。
これはset
sを網羅していませんが、dict
sとlist
sの良い説明です。
リストはそれらが見えるもの - 値のリストです。それらのそれぞれは、ゼロから始まる番号が付けられています - 最初のものはゼロ、2番目の1、3番目の2などの番号が付けられています。リストから値を削除し、最後に新しい値を追加することができます。例:あなたのたくさんの猫の名前。
辞書は、その名前が示すもの、つまり辞書に似ています。辞書には、単語の「索引」があり、それぞれに定義があります。 Pythonでは、Wordは「キー」と呼ばれ、定義は「値」と呼ばれます。辞書の値は番号付けされていません - 彼らの名前が示唆するものに似ている - 辞書。辞書には、単語の「索引」があり、それぞれに定義があります。辞書の値は番号付けされていません - それらは特定の順序でもありません - キーも同じことをします。辞書の値を追加、削除、変更することができます。例:電話帳.
それらを使用するとき、私はあなたの参照のためにそれらの方法の徹底的なチートシートを作ります:
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'}}
要するに、以下を使用します。
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
のアイテムl
はx
に置き換えられますl[i:j] = t
-l
のi
から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
-l
をt
の内容で拡張しますl *= n
-l
の内容をn
回繰り返して更新しますl.insert(i, x)
-x
で指定されたインデックスでl
にi
を挿入しますl.pop([i])
-i
のアイテムを取得し、l
からも削除しますl.remove(x)
-l
から最初の項目を削除します(l[i]
はxと等しい)l.reverse()
-所定の位置にあるl
のアイテムを反転しますリストは、append
メソッドとpop
メソッドを利用してスタックとして使用できます。
辞書は、ハッシュ可能な値を任意のオブジェクトにマップします。辞書は可変オブジェクトです。辞書の主な操作は、キーを使用して値を保存し、キーを指定して値を抽出することです。
ディクショナリでは、ハッシュできない値、つまりリスト、ディクショナリ、またはその他の可変タイプを含む値をキーとして使用できません。
セットは、個別のハッシュ可能なオブジェクトの順序付けられていないコレクションです。セットは一般に、メンバーシップテスト、シーケンスからの重複の削除、交差、結合、差、対称差などの数学演算の計算に使用されます。
リスト、dictsおよび集合と組み合わせると、もう1つ興味深いことがあります。 pythonオブジェクト、 OrderedDicts 。
順序付き辞書は通常の辞書とまったく同じですが、項目が挿入された順序を覚えています。順序付き辞書を反復処理するとき、項目はキーが最初に追加された順序で返されます。
OrderedDictsは、キーの順序を保持する必要がある場合、たとえばドキュメントを扱う場合に便利です。ドキュメント内のすべての用語のベクトル表現が必要な場合が一般的です。そのため、OrderedDictsを使用すると、用語の前に読んだことがあるかどうかを効率的に確認し、用語を追加し、用語を抽出します。
リストそれらが見えるものです - 値のリスト。それらのそれぞれは、ゼロから始まる番号が付けられています - 最初のものはゼロ、2番目の1、3番目の2などの番号が付けられています。リストから値を削除し、最後に新しい値を追加することができます。例:あなたのたくさんの猫の名前。
Tuplesは単なるリストに似ていますが、それらの値を変更することはできません。あなたが最初にそれをあきらめる値は、あなたがプログラムの残りの部分で行き詰まっている値です。また、参照しやすいように、各値にはゼロから始まる番号が付けられています。例:その年の月の名前.
辞書彼らの名前が示すものに似ています - 辞書。辞書には、単語の「索引」があり、それぞれに定義があります。 Pythonでは、Wordは「キー」と呼ばれ、定義は「値」と呼ばれます。辞書の値は番号付けされていません - 彼らの名前が示唆するものに似ている - 辞書。辞書には、単語の「索引」があり、それぞれに定義があります。 Pythonでは、Wordは「キー」と呼ばれ、定義は「値」と呼ばれます。辞書の値は番号付けされていません - それらは特定の順序でもありません - キーも同じことをします。辞書の値を追加、削除、変更することができます。例:電話帳.
C++では常にこのフローチャートを念頭に置いていました。 どのシナリオで特定のSTLコンテナーを使用しますか? なので、Python3で同様のものが利用できるかどうかに興味がありましたが、運が悪かった。
Pythonについて留意する必要があるのは、次のとおりです。C++の場合のようなPython標準はありません。そのため、Pythonインタプリタ(CPython、PyPyなど)によって大きな違いがあるかもしれません。次のフローチャートはCPython用です。
さらに、bytes
、byte arrays
、tuples
、named_tuples
、ChainMap
、Counter
、およびarrays
のようなデータ構造をダイアグラムに組み込むための良い方法が見つかりませんでした。
OrderedDict
とdeque
はcollections
モジュールを通して利用できます。heapq
はheapq
モジュールから入手できますLifoQueue
、Queue
、およびPriorityQueue
は、同時(スレッド)アクセス用に設計されたqueue
モジュールを介して使用できます。 (利用可能なmultiprocessing.Queue
もありますが、queue.Queue
との違いはわかりませんが、プロセスからの同時アクセスが必要な場合に使用することを想定しています。)dict
、set
、frozen_set
、およびlist
はもちろん組み込まれていますあなたがこの答えを改善し、あらゆる面でより良い図表を提供することができれば誰にとっても私は感謝するでしょう。お気軽にどうぞ。
シモンズ:図はyedで作られています。 graphmlファイル こちらです