change key in OrderedDict without losing order

后端 未结 2 725
挽巷
挽巷 2020-12-16 10:28

Starting with

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

is it possible to end up with

OrderedDict([(\'a\', 1), (\'_         


        
相关标签:
2条回答
  • 2020-12-16 11:28

    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.

    0 讨论(0)
  • 2020-12-16 11:30

    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)])
    
    0 讨论(0)
提交回复
热议问题