13

順序付けされた辞書があり、個々の順序を変更したいと考えています。以下のコード例では、項目 3 (人) をその値とともに位置 2 に移動したいと考えています。したがって、順序は動物、人、食べ物、飲み物になります。彼についてどうすればいいですか?

import collections

queue = collections.OrderedDict()

queue["animals"] = ["cat", "dog", "fish"]
queue["food"] = ["cake", "cheese", "bread"]
queue["people"] = ["john", "henry", "mike"]
queue["drinks"] = ["water", "coke", "juice"]

print queue
4

4 に答える 4

19

OrderedDictsは広告掲載順で並べられています。key:valueしたがって、元のオブジェクトのペアをループして、新しい OrderedDict を構築する必要があります。あなたを助ける方法はありませOrderedDictん。

したがってtuple、 のアイデアの順序を表すを作成keysし、それを繰り返して新しい を作成できますOrderedDict

key_order = ('animal', 'people', 'food', 'drink')
new_queue = OrderedDict()
for k in key_order:
    new_queue[k] = queue[k]

またはもっと雄弁に

OrderedDict((k, queue[k]) for k in key_order)
于 2014-03-26T14:32:49.817 に答える
6

編集:カスタム関数を書くことができます(警告、これは機能しますが、非常に速くて汚いです):

編集:前進しようとすると発生するバグを修正

import collections

def move_element(odict, thekey, newpos):
    odict[thekey] = odict.pop(thekey)
    i = 0
    for key, value in odict.items():
        if key != thekey and i >= newpos:
            odict[key] = odict.pop(key)
        i += 1
    return odict

queue = collections.OrderedDict()

queue["animals"] = ["cat", "dog", "fish"]
queue["food"] = ["cake", "cheese", "bread"]
queue["people"] = ["john", "henry", "mike"]
queue["drinks"] = ["water", "coke", "juice"]
queue["cars"] = ["astra", "focus", "fiesta"]

print queue

queue = move_element(queue, "people", 1)

print queue
于 2014-03-26T14:40:37.137 に答える
1

手動で行う必要があると思います:

>>> keys = list(queue)
>>> keys
['animals', 'food', 'people', 'drinks']
>>> keys[1], keys[2] = keys[2], keys[1]
>>> queue = collections.OrderedDict((key, queue[key]) for key in keys)
>>> list(queue)
['animals', 'people', 'food', 'drinks']
于 2014-03-26T14:33:44.013 に答える
-1

この質問を参照してください。

順序を明示的に再定義しないと、期待どおりに辞書をソートできないと思います。

于 2014-03-26T14:34:27.540 に答える