Pregunta

Actualmente estoy implementación de un complejo de red trófica microbiana en Python usando SciPy.integrate.ode . Necesito la capacidad de agregar fácilmente las especies y reacciones en el sistema, así que tengo que codificar algo bastante general. Mi plan es como la siguiente:

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<timeToSolve:
         o.integrate()

    #process o.t and o.y (o.t contains the time points
    #and o.y contains the solution matrix)

Por lo tanto, la pregunta es, cuando iterar sobre los diccionarios en Species.sumOverAllReactionsForThisSpecies() y FermentationChamber.step(), es la iteración orden de los diccionarios garantizados a ser el mismo si se añaden o eliminan sin elementos de los diccionarios entre la primera y la última iteración? Es decir, puedo suponer que el orden de la matriz numpy creado en cada iteración del diccionario no variará? Por ejemplo, si un diccionario tiene el formato { 'Glucosa': 10 'fructosa': 12}, si una matriz creada a partir de este diccionario será siempre tiene el mismo orden (no importa lo que el orden es, siempre y cuando sea determinista).

Lo siento por el mega-post, sólo quería saber dónde vengo.

¿Fue útil?

Solución

Python 3.1 tiene un href="http://docs.python.org/3.1/library/collections#collections.OrderedDict" rel="nofollow noreferrer"> collections.OrderedDict clase

Los href="http://svn.python.org/view/python/trunk/Lib/collections.py?view=markup" de OrderedDict propio es compatible con Python 2.x, aunque algunos métodos heredados (de la _ abcoll módulo) hace uso de Python 3-sólo presenta. Sin embargo, pueden ser modificados para 2.x código con el mínimo esfuerzo.

Otros consejos

Sí, el mismo orden está garantizado si no se modifica.

Consulte la documentación aquí .

Editar

En cuanto a si se cambia el valor (pero no añadir / eliminar una clave) afectará a la orden, esto es lo que los comentarios en el C-fuente dice:

/* 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.
 */

Parece que no es un detalle de implementación, sino un requisito de la lengua.

Siempre no se introducen modificaciones en el diccionario, la respuesta es sí. Consulte la documentación aquí .

Sin embargo, los diccionarios no están ordenados por la naturaleza en Python. En general, no es la mejor práctica de confiar en los diccionarios de datos ordenados sensibles.

Un ejemplo de un una solución más robusta sería de Django estructura de datos SortedDict .

Si desea que el fin de ser coherente, me gustaría hacer algo para forzar un orden en particular. Aunque es posible que pueda convencerse de que el orden está garantizado, y puede que tengan razón, parece frágil para mí, y que será un misterio para otros desarrolladores.

Por ejemplo, puede resaltar siempre en su pregunta. Es importante que sea el mismo orden en Python 2.5 y 2.6? 2.6 y 3.1? CPython y Jython? Yo no contaría con ellos.

También recomendaría no confiar en el hecho de los diccionarios orden es no aleatoria.

Si desea un sistema incorporado en la solución a la clasificación que el diccionario de leer http: // www .python.org / dev / PEP / PEP-0265 /

Aquí es el material más relevante:

Este PEP se rechaza porque la necesidad de que haya sido en gran parte     cumplida por ordenados función incorporada de 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)]
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top