Как вы получаете элементы из словаря в порядке их вставки? - PullRequest
55 голосов
/ 14 сентября 2008

Можно ли получить элементы из словаря Python в порядке их добавления?

Ответы [ 11 ]

50 голосов
/ 14 сентября 2008

Стандартный Python dict делает это по умолчанию, если вы используете CPython 3.6+ (или Python 3.7+ для любой другой реализации Python).

В старых версиях Python вы можете использовать collections.OrderedDict.

17 голосов
/ 14 сентября 2008

Остальные ответы верны; это невозможно, но вы можете написать это сами. Однако, в случае, если вы не знаете, как на самом деле реализовать что-то подобное, вот полная и работающая реализация, которая диктует подклассы, которые я только что написал и протестировал. (Обратите внимание, что порядок значений, передаваемых в конструктор, не определен, но он будет предшествовать значениям, переданным позже, и вы всегда можете просто не допустить, чтобы упорядоченные диктовки инициализировались значениями.)

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')]
15 голосов
/ 29 октября 2014

Использовать OrderedDict (), доступно с версии 2.7

Просто любопытство:

from collections import OrderedDict
a = {}
b = OrderedDict()
c = OredredDict()

a['key1'] = 'value1'
a['key2'] = 'value2'

b['key1'] = 'value1'
b['key2'] = 'value2'

c['key2'] = 'value2'
c['key1'] = 'value1'

print a == b #True
print a == c #True
print b == c #False
6 голосов
/ 10 августа 2018

Начиная с Python 3.7, стандартный dict сохраняет порядок вставки. Из документов :

Изменено в версии 3.7: порядок словаря гарантированно является порядком вставки. Это поведение было деталью реализации CPython от 3.6.

Итак, вы должны иметь возможность перебирать словарь в обычном режиме или использовать popitem().

6 голосов
/ 15 сентября 2008

Или просто сделайте ключ кортежем с time.now () в качестве первого поля в кортеже.

Затем вы можете получить ключи с помощью dictname.keys (), sort и вуаля!

Gerry

5 голосов
/ 14 сентября 2008

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

3 голосов
/ 15 сентября 2008

Я использовал StableDict раньше с хорошим успехом.

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

1 голос
/ 18 марта 2009

Или используйте любую из реализаций для PEP-372 , описанного здесь , например odict module из pythonutils .

Я успешно использовал реализацию pocoo.org, это так же просто, как заменить вашу

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

с

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

и требуется этот файл

0 голосов
/ 04 июня 2014

Что вы можете сделать, это вставить значения с помощью клавиши, представляющей введенный порядок, а затем вызвать sorted() для элементов.

>>> obj = {}
>>> obj[1] = 'Bob'
>>> obj[2] = 'Sally'
>>> obj[3] = 'Joe'
>>> for k, v in sorted(obj.items()):
...     print v
... 
Bob
Sally
Joe
>>> 
0 голосов
/ 19 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...