65

挿入された順序で Python 辞書から項目を取得することは可能ですか?

4

11 に答える 11

67

dictCPython 3.6+ (または Python の他の実装の場合は Python 3.7+) を使用している場合、標準の Pythonはデフォルトでこれを行います。

古いバージョンの Python では、collections.OrderedDict.

于 2008-09-13T20:48:36.003 に答える
17

他の答えは正しいです。不可能ですが、これを自分で書くことはできます。ただし、このようなものを実際に実装する方法がわからない場合は、 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')]
于 2008-09-14T00:58:30.413 に答える
5

基本の dict クラスではこれを行うことはできません -- ハッシュ順になっています。実際にはキー、値のペアなどのリストであり、順序付けられる独自の辞書を作成できます。

于 2008-09-13T20:39:58.803 に答える
5

または、タプルの最初のフィールドとして time.now() を使用してキーをタプルにします。

次に、dictname.keys()、sort、voila でキーを取得できます。

ジェリー

于 2008-09-15T19:31:43.350 に答える
3

以前に StableDict を使用して成功しました。

http://pypi.python.org/pypi/StableDict/0.2

于 2008-09-15T18:15:46.853 に答える
1

または、 pythonutilsのodictモジュールなど、ここで説明されているPEP-372の実装のいずれかを使用します。

私は pocoo.org の実装をうまく使いました。

my_dict={}
my_dict["foo"]="bar"

my_dict=odict.odict()
my_dict["foo"]="bar"

このファイルだけが必要です

于 2009-03-18T19:42:29.707 に答える
0

後で参照するためにキーを別のリストに保存しない限り、それは不可能です。

于 2008-09-19T15:56:35.460 に答える
-1

dict 機能が不要で、挿入した順序でタプルを返すだけでよい場合は、キューの方がうまく機能しませんか?

于 2008-09-15T16:07:04.213 に答える