5

idたとえば、私には刑務所の囚人が何人かいます。各囚人には名前があります。

辞書がどのように機能するか、タプルがどのように機能するか、リストがどのように機能するかを知っていますが、辞書が使用されていることや、タプルのリストが使用されていることもあります。私の場合、どちらを使用すればよいですか?

d = {
    1: "Mike",
    2: "Bob",
    3: "Tom"
}

vs

l = [
    (1, "Mike"),
    (2, "Bob"),
    (3, "Tom")
]

そして、質問を一般化するために、いつdictを使用する必要があり、いつタプルのリストを使用する必要があるのか​​、1つの利点は何ですか?

4

3 に答える 3

8

アイテムを順番に格納することが理にかなっている場合は、リストを使用する必要があります。この場合、ID が名前にマップされていることだけが重要です。

ディクショナリはマッピングです。つまり、キーと値の関係は対称的ではありません。たとえば、既知の値でキーをフェッチするのはトリッキーです (通常、常に可能であるとは限りません) が、タプルのリスト (さらに言えば、セット) をアイテムの値でフィルタリングするのは同じくらい簡単です。

そうは言っても、データ構造を選択するときは、そこからデータを取得する方法を検討することは理にかなっています。とが C に似たものの等しい部分であるidことがわかる場合(たとえば、それらのいずれかで検索する必要があります)、タプルまたは. 順序を維持する必要に応じて、それらをリストまたはセットに入れることができます。namestructcollections.namedtuple

しかしid、オブジェクトに関する残りの情報を取得するために使用される「特別な」フィールドであり、一意であることが保証されている場合 (「ID」はそれを意味します)、内部順序は必要ありません。一定時間ランダム アクセス -- もちろん辞書を使用します。

于 2013-01-20T11:38:50.380 に答える
5

それらの間には2つの大きな違いがあります。

  • 辞書は順序付けられていません。タプルのリストはです。したがって、順序が重要な場合は、後者を使用してください。

  • キーを値にマッピングするには、dictで一定の時間がかかり、タプルのリストで同じことを行うには線形時間がかかります。したがって、キーと値のペアの数が多いほど、タプルのリストをスキャンして一致するものを見つけるのにかかる時間が長くなりますが、辞書では、ルックアップは常にほぼ瞬時に行われます。

    (タプルがソートされた順序で保持されている場合は、バイナリ検索を使用して検索時間をO(log n)に短縮できますが、それでも辞書の定数時間よりも遅くなります)。

ほとんどの場合、を使用しdictます。注文が必要な場合でも、collections.OrderedDict代わりに使用して両方の長所を活かすことができます。

于 2013-01-20T11:37:22.147 に答える
2

あなたの場合、私は辞書を使います。使用を検討する理由はいくつかあります。

  • 辞書では、APIを使用して内部のキーと値を操作できます。これには、タプルのリストを使用するためのコードがさらに必要になります。

たとえば、次のことを考慮してください。

辞書を使用して囚人の名前を取得するには、次のようにします。

d.values()

タプルのリストで同じことを行うには、次のことを行う必要があります。

names = []
for tup in l:
    names.append(tup[1])
  • ディクショナリの値は変更可能です。つまり、変更を許可できます。タプルで同じことを行うことはできません不変です)。

例えば

d[1] = 'Fotis'

タプルのリストで同じことを実現するには、操作するタプルを新しいタプルに置き換える必要があります。

例えば

l[1] = (2, 'Max')
于 2013-01-20T11:35:21.597 に答える