OrderedDict.items () также сохраняет порядок? - PullRequest
0 голосов
/ 22 сентября 2019

Предполагая, что я использую следующий OrderedDict:

order_dict = OrderedDict([("a",1), ("b",2), ("c",3)])

В какой-то момент я хотел бы получить элементы (ключ, значение) и определить итератор, иначните перемещать его, как только пожелаете:

ordered_dict_items_iter = iter(ordered_dict.items())
...
key,val = next(ordered_dict_items_iter)
...

Я хотел бы знать, если order_dict.items() также сохранит тот же порядок?

Как я заметил, кажется, что он сохраняет порядок,однако я не смог доказать это.

Ответы [ 3 ]

0 голосов
/ 22 сентября 2019

Да, он сохранит порядок, указанный вами при инициализации словаря.

0 голосов
/ 22 сентября 2019

Да.OrderedDict.items() вернет items в порядке их вставки.

Если вы проверите реализацию из OrderedDict, вы увидите, что items возвращает _OrderedDictItemsView.

class OrderedDict(dict):
    ...
    ...
    def items(self):
        "D.items() -> a set-like object providing a view on D's items"
        return _OrderedDictItemsView(self)

И если вы будете копать глубже и найдете реализацию из _OrderedDictItemsView,

class _OrderedDictItemsView(_collections_abc.ItemsView):

    def __reversed__(self):
        for key in reversed(self._mapping):
            yield (key, self._mapping[key])

И если вы пойдете глубже, проверьте _collections_abc.ItemsView , вы увидите, что

class ItemsView(MappingView, Set):
    ...
    ...
    def __iter__(self):
        for key in self._mapping:
           yield (key, self._mapping[key])

И далее вниз по MappingView вы увидите,

class MappingView(Sized):

    __slots__ = '_mapping',

    def __init__(self, mapping):
        self._mapping = mapping

Теперь наше путешествие достиглоэто пункт назначения, и мы видим, что _mapping - это OrderedDict, который мы создали, и он всегда в порядке.Метод __iter__ ItemsView просто перебирает каждое значение ключа в OrderedDict.Отсюда и доказательство:)

0 голосов
/ 22 сентября 2019

Это так.Идея OrderedDict состоит в том, что он ведет себя точно как словарь, но внутренне это список кортежей, представляющих пары ключ-значение, так что порядок сохраняется.Все методы словаря реплицируются с использованием этого списка кортежей.

Примечание. После python 3.7 стандартные словари также гарантированно поддерживают порядок вставки.

...