2017-09-22 16 views
1
dict_mark = {'Wang': 'C', 'Li': 'B', 'Ma': 'A'} 
s = '' 
for c in dict_mark.values(): 
    s += c 
print(s) 

辞書が順序付けされていないので、なぜdict_mark.values()は常に'C' 'B' 'A'のようなこの値のシーケンスを返しますか?dict.values()は順序付きのシーケンスで返されますか?

なぜわからない'B' 'A' 'C'または'A' 'B' 'C'

+4

「Dict」は値をハッシュテーブルに格納します。ハッシュテーブルの仕組みを読んでください。基本的には、項目の順序を保証することができないため、データは順序付けされていません。それはハッシュテーブルの動作の仕方だからです。 – Vinny

+3

これはPythonの実装とバージョン間での動作が異なることも知っておいてください。 –

答えて

1

順序付けられていないdosは決定的ではありません。パイソン2.x docsから

商品IF()、キー()、値()、iteritems()、iterkeys()、及び itervaluesは() にない介在修飾と呼ばれていますリストは、直接対応します。 python 3.x docs

キーと値は、非ランダムであるPythonの実装を横切って変化し、挿入および欠失の辞書の履歴に依存する任意の順序でにわたって繰り返されます。

したがって、辞書を変更するまで、返されるシーケンスは常に同じです。あなたはそれでソートされているオブジェクトを前提にすることはできません。

this question and the answers to itを見てください。ここで、Python 3.6+ dictsが実際に注文された理由(そしてその方法)について議論します。

-1

これは、Pythonのいくつかの点に依存しています。あなたはそれについて考えるべきではありません。なぜなら、辞書の順序は重要ではないからです。

+1

は、あなたが実際に答えを提供し、それは無関係だ理由を説明場合は、適切な答えは「それについては不思議ではないはずです」。偶然にも、辞書に挿入秩序を維持すること – GPhilo

+0

役立つことが可能なシナリオは、[この質問](https://stackoverflow.com/questions/39980323/dictionaries-are-ordered-in-pythonを見てください確かにありますなぜこのようなことが実際には非常に有用なのかの例については、 – GPhilo

0

dict格納のデータをハッシュテーブルのデータ構造に。ハッシュテーブルはどのように機能しますか?

一言で言えば、dictは8スロットの配列のようなオブジェクトに初期化されているとしましょう。 dictに新しいキーと値のペアを追加すると、キーが存在するスロットを返す関数を使用してキーがhashesになります。これは、スロットがすでに使用されている可能性があるため、確定的ではありません。再評価し、別のスロットを探す必要があります。

そのため、dict.values()から値を取得する順序は、そのデータによって異なります。だからこそ、それは順序付けられていないと呼ばれています。私はキーの順序を変更した場合、私は辞書のキーと値のペアを印刷するとき、それはまた別の表示され、

>>> d = {'a': 1, 'aa': 2} 
>>> d 
{'a': 1, 'aa': 2} 

>>> d = {'aa': 1, 'a': 2} 
>>> d 
{'aa': 1, 'a': 2} 

は例えば、この単純な辞書を考えます。しかし、私は別のキー

>>> d = {'b': 1, 'a': 2} 
>>> d 
{'a': 2, 'b': 1} 

Althoughtを使用した場合に何が起こるか見て、私は最初、それは'a'後に割り当てられた'b'キーを述べました。

ただし、dictが設定されると、dict.items()と呼ばれると常に同じ順序が返されます。

0

辞書、ハッシュテーブルとして格納されます。 3.6より前のバージョンのPythonでは、反復はハッシュテーブルに表示されている順に行われるため、取得する順序は各キーのハッシュ値によって決まります。また、ハッシュ競合が発生した場合、挿入と削除の順序に基づいて変更することもできます。

Python 2.xでは、文字列のハッシュ値は固定値なので、Pythonバージョン間で変更される可能性がありますが、辞書には常に同じ順序とアクションが固定されています。 Pythonの3の一部のバージョンで

、文字列のハッシュ値は、ランダムな係数を有するので、異なるランは異なる結果を与えます。 Pythonの3.6で再度挿入の順序に関係します固定順序を取得しますので、繰り返し順序は、もはやハッシュキーに依存しない(しかし、それは将来的に再び変化しないという保証はありません)。

$ python2.7 /tmp/t.py 
ACB 
$ python2.7 /tmp/t.py 
ACB 
$ python3.5 /tmp/t.py 
BCA 
$ python3.5 /tmp/t.py 
ABC 
$ python3.5 /tmp/t.py 
CBA 
関連する問題