Я в настоящее время реализую сложную микробную пищевую сеть в 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}, если Массив, созданный из этого словаря, будет всегда иметь тот же порядок (не имеет значения, каков тот порядок, пока это детерминировано).
Извините за мегасообщение я просто хотел сообщить, куда я происхожу из.
Python 3.1 имеет коллекции . Класс . Класс , который можно использовать для этой цели. Это очень эффективно: «Время работы Big-o для всех методов одинаково, что для обычных словарей».
Код для самого заказа совместим с Python 2.x, хотя некоторые унаследованные методы (Из модуля _abcoll ) Используйте функции только для Python 3. Однако они могут быть изменены до 2.x код с минимальными усилиями.
Если вы хотите, чтобы приказ быть последовательным, я бы сделал что-то, чтобы заставить определенный порядок. Хотя вы сможете убедить себя, что порядок гарантирован, и вы можете быть правы, это кажется мне хрупким, и это будет таинственным для других разработчиков.
Например, вы подчеркиваете всегда в вашем вопросе. Важно ли то, что это тот же порядок в Python 2.5 и 2.6? 2.6 и 3.1? Cpython и Jython? Я бы не рассчитывал на тех.
предоставлена NO Модификации издаются в словаре, Ответ да. Смотрите документы здесь .
Тем не менее, словари неупорядочены природой в Python. В целом, это не лучшая практика, чтобы полагаться на словари для чувствительных отсортированных данных.
Пример более прочного раствора будет Сотрудничество Django SortedDict Data .
Я также рекомендовал бы не полагаться на тот факт, что словари порядок нерендарный.
Если вы хотите, чтобы построить встроенное решение, чтобы сортировать свой словарь, чтение 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)]
Да, тот же порядок гарантирован, если он не изменен.
Смотрите документы здесь .
Отредактируйте:
Что касается изменения значения (но не добавление / удаление ключа) повлияет на заказ, это то, что комментарии в 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.
*/
кажется, что это не деталь реализации , но требование языка.