Порядок словаря Python гарантирован по повторениям?

Я в настоящее время реализую сложную микробную пищевую сеть в Python с помощью SciPy.integrate.ode. Мне нужна способность легко добавить разновидности и реакции на систему, таким образом, я должен кодировать что-то довольно общее. Моя схема выглядит примерно так:

class Reaction(object):
    def __init__(self):
        #stuff common to all reactions
    def __getReactionRate(self, **kwargs):
        raise NotImplementedError

... Reaction subclasses that 
... implement specific types of reactions


class Species(object):
    def __init__(self, reactionsDict):
        self.reactionsDict = reactionsDict
        #reactionsDict looks like {'ReactionName':reactionObject, ...}
        #stuff common to all species

    def sumOverAllReactionsForThisSpecies(self, **kwargs):
        #loop over all the reactions and return the 
        #cumulative change in the concentrations of all solutes

...Species subclasses where for each species
... are defined and passed to the superclass constructor

class FermentationChamber(object):
    def __init__(self, speciesList, timeToSolve, *args):
        #do initialization

    def step(self):
        #loop over each species, which in turn loops 
        #over each reaction inside it and return a 
        #cumulative dictionary of total change for each 
        #solute in the whole system


if __name__==__main__:
    f = FermentationChamber(...)

    o  = ode(...) #initialize ode solver

    while o.successful() and o.t

Так, вопрос, когда я выполняю итерации по словарям в Species.sumOverAllReactionsForThisSpecies() и FermentationChamber.step(), итеративный порядок словарей, гарантировал, что был тем же, если никакие элементы не добавлены или удалены из словарей между первым и последним повторением? Таким образом, я могу предположить, что порядок массива numpy, созданного при каждом повторении из словаря, не будет варьироваться? Например, если словарь имеет формат {'Глюкоза ':10, 'Фруктоза ':12}, если Массив, созданный из этого словаря, будет всегда иметь тот же порядок (не имеет значения, каков тот порядок, пока это детерминировано).

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

34
задан Chinmay Kanchi 13 January 2010 в 00:53
поделиться

5 ответов

Python 3.1 имеет коллекции . Класс . Класс , который можно использовать для этой цели. Это очень эффективно: «Время работы Big-o для всех методов одинаково, что для обычных словарей».

Код для самого заказа совместим с Python 2.x, хотя некоторые унаследованные методы (Из модуля _abcoll ) Используйте функции только для Python 3. Однако они могут быть изменены до 2.x код с минимальными усилиями.

3
ответ дан 27 November 2019 в 16:15
поделиться

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

Например, вы подчеркиваете всегда в вашем вопросе. Важно ли то, что это тот же порядок в Python 2.5 и 2.6? 2.6 и 3.1? Cpython и Jython? Я бы не рассчитывал на тех.

7
ответ дан 27 November 2019 в 16:15
поделиться

предоставлена ​​ NO Модификации издаются в словаре, Ответ да. Смотрите документы здесь .

Тем не менее, словари неупорядочены природой в Python. В целом, это не лучшая практика, чтобы полагаться на словари для чувствительных отсортированных данных.

Пример более прочного раствора будет Сотрудничество Django SortedDict Data .

8
ответ дан 27 November 2019 в 16:15
поделиться

Я также рекомендовал бы не полагаться на тот факт, что словари порядок нерендарный.

Если вы хотите, чтобы построить встроенное решение, чтобы сортировать свой словарь, чтение http://www.python.org/dev/peps/pep-0265/

Вот самый актуальный материал:

это PEP отклонен, потому что необходимость в ней была в значительной степени Выполнено сортировкой PY2.4 сортированной функцией ():

    >>> sorted(d.iteritems(), key=itemgetter(1), reverse=True)
    [('b', 23), ('d', 17), ('c', 5), ('a', 2), ('e', 1)]

or for just the keys:

    >>> sorted(d, key=d.__getitem__, reverse=True)
    ['b', 'd', 'c', 'a', 'e']

Also, Python 2.5's heapq.nlargest() function addresses the common use
case of finding only a few of the highest valued items:

    >>> nlargest(2, d.iteritems(), itemgetter(1))
    [('b', 23), ('d', 17)]
6
ответ дан 27 November 2019 в 16:15
поделиться

Да, тот же порядок гарантирован, если он не изменен.

Смотрите документы здесь .

Отредактируйте:

Что касается изменения значения (но не добавление / удаление ключа) повлияет на заказ, это то, что комментарии в C-Source говорят:

/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the
 * dictionary if it's merely replacing the value for an existing key.
 * This means that it's safe to loop over a dictionary with PyDict_Next()
 * and occasionally replace a value -- but you can't insert new keys or
 * remove them.
 */

кажется, что это не деталь реализации , но требование языка.

65
ответ дан 27 November 2019 в 16:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: