挿入された順序で辞書から項目を取得するにはどうすればよいでしょうか?
-
09-06-2019 - |
質問
Python 辞書から項目を挿入された順序で取得することは可能ですか?
解決
標準的なPython dict
CPython 3.6 以降 (または Python の他の実装の場合は Python 3.7 以降) を使用している場合、これはデフォルトで行われます。
古いバージョンの Python では次のように使用できます collections.OrderedDict
.
他のヒント
他の答えは正しいです。それは不可能ですが、これを自分で書くことはできます。ただし、このようなものを実際に実装する方法がわからない場合に備えて、私が作成してテストしたばかりの dict をサブクラス化する完全で動作する実装をここに示します。(コンストラクターに渡される値の順序は未定義ですが、後で渡される値よりも前に来るので、順序付けされた辞書を値で初期化することを常に許可しないことに注意してください。)
class ordered_dict(dict):
def __init__(self, *args, **kwargs):
dict.__init__(self, *args, **kwargs)
self._order = self.keys()
def __setitem__(self, key, value):
dict.__setitem__(self, key, value)
if key in self._order:
self._order.remove(key)
self._order.append(key)
def __delitem__(self, key):
dict.__delitem__(self, key)
self._order.remove(key)
def order(self):
return self._order[:]
def ordered_items(self):
return [(key,self[key]) for key in self._order]
od = ordered_dict()
od["hello"] = "world"
od["goodbye"] = "cruel world"
print od.order() # prints ['hello', 'goodbye']
del od["hello"]
od["monty"] = "python"
print od.order() # prints ['goodbye', 'monty']
od["hello"] = "kitty"
print od.order() # prints ['goodbye', 'monty', 'hello']
print od.ordered_items()
# prints [('goodbye','cruel world'), ('monty','python'), ('hello','kitty')]
バージョン 2.7 以降で利用可能な OrderedDict() を使用します。
ただの好奇心の問題です:
from collections import OrderedDict
a = {}
b = OrderedDict()
c = OredredDict()
a['key1'] = 'value1'
a['key2'] = 'value2'
b['key1'] = 'value1'
b['key2'] = 'value2'
c['key2'] = 'value2'
c['key1'] = 'value1'
print a == b #True
print a == c #True
print b == c #False
または、キーをタプルの最初のフィールドとして time.now() を含むタプルにします。
次に、dictname.keys()、sort を使用してキーを取得すると、出来上がりです。
ジェリー
Python 3.7 では、標準の dict は挿入順序を保持します。から ドキュメント:
バージョン 3.7 で変更された点:辞書の順序は挿入順序であることが保証されます。この動作は、3.6 からの CPython の実装の詳細でした。
したがって、辞書を通常どおり反復処理するか、次のように使用できるはずです。 popitem()
.
基本 dict クラスではこれを行うことはできません。ハッシュによって順序付けされます。実際に順序付けられるキー、値のペアなどのリストである独自の辞書を構築することもできます。
私は以前に StableDict を使用して成功しました。
または、いずれかの実装を使用します。 PEP-372 説明された ここ, 、 以下のような odictモジュール から Pythonutils.
私は pocoo.org 実装をうまく使用しました。それは、あなたのものを置き換えるのと同じくらい簡単です。
my_dict={}
my_dict["foo"]="bar"
と
my_dict=odict.odict()
my_dict["foo"]="bar"
そして必要なのはただ このファイル
後で参照できるようにキーを別のリストに保存しない限り、これは不可能です。
できることは、入力された順序を表すキーを使用して値を挿入し、次を呼び出すことです。 sorted()
アイテムについて。
>>> obj = {}
>>> obj[1] = 'Bob'
>>> obj[2] = 'Sally'
>>> obj[3] = 'Joe'
>>> for k, v in sorted(obj.items()):
... print v
...
Bob
Sally
Joe
>>>
dict 機能が必要なく、挿入した順序でタプルを返すだけでよい場合は、キューの方がうまく機能するのではないでしょうか。