Frage

Starting with

OrderedDict([('a', 1), ('c', 3), ('b', 2)])

is it possible to end up with

OrderedDict([('a', 1), ('__C__', 3), ('b', 2)])

making sure that the '__C__' item is before 'b' and after 'a' i.e. keeping order?

War es hilfreich?

Lösung

You could try:

>>> d = OrderedDict([('a', 1), ('c', 3), ('b', 2)])
>>> d
OrderedDict([('a', 1), ('c', 3), ('b', 2)])
>>> d2 = OrderedDict([('__C__', v) if k == 'c' else (k, v) for k, v in d.items()])
>>> d2
OrderedDict([('a', 1), ('__C__', 3), ('b', 2)])

Andere Tipps

if you wish to mutate the current dictionary object:

def change_key(self, old, new):
    for _ in range(len(self)):
        k, v = self.popitem(False)
        self[new if old == k else k] = v

This works by iterating over the whole OrderedDict (using its length), and pop'ing its first item (by passing False to .popitem(): the default of this method is to pop the last item) into k and v (respectively standing for key and value); and then inserting this key/value pair, or the new key with its original value, at the end of the OrderedDict.

By repeating this logic for the entire size of the dict, it effectively rotates the dict completely, thus recreating the original order.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top