Frage

Ich bin derzeit ein komplexes mikrobielle Nahrungsnetz in Python mit SciPy.integrate.ode . Ich brauche die Fähigkeit, leicht zu Spezies und Reaktionen zum System hinzuzufügen, so dass ich, um Code auf etwas ganz allgemein habe. Mein Plan sieht etwa so aus:

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)

Also, die Frage ist, wenn ich Iterierte über die Wörterbücher in Species.sumOverAllReactionsForThisSpecies() und FermentationChamber.step() ist die Iterationsreihenfolge der Wörterbücher garantiert die gleiche sein, wenn keine Elemente hinzugefügt oder aus den Wörterbüchern zwischen dem ersten entfernt und der letzten Iteration? Das heißt, kann ich davon ausgehen, dass die Reihenfolge der numpy Array bei jeder Iteration aus dem Wörterbuch variieren wird nicht erstellt? Wenn beispielsweise ein Wörterbuch, das Format hat { ‚Glucose‘: 10, ‚Fruktose‘: 12}, wenn ein Array aus diesem Wörterbuch erstellt wird immer hat die gleiche Reihenfolge (es spielt keine Rolle, was dass Ordnung ist, solange es deterministisch ist).

Sorry für die Mega-Post, ich wollte nur, damit Sie wissen, woher ich komme.

War es hilfreich?

Lösung

Python 3.1 hat eine collections.OrderedDict Klasse, die sein kann, für diesen Zweck verwendet. Es ist sehr effizient, auch: „Big-O-Zeiten für alle Methoden sind die gleichen wie für reguläre Wörterbücher läuft“

Die Code für OrderedDict selbst mit Python 2.x kompatibel ist, obwohl einige geerbte Methoden (von der _ abcoll Modul) verwenden Sie Python 3-ausschließlich. Sie können jedoch auf 2.x Code mit minimalem Aufwand geändert werden.

Andere Tipps

Ja, die gleiche Ordnung gewährleistet, wenn es nicht geändert wird.

Siehe docs hier .

Edit:

In Bezug auf, wenn die Änderung des Wertes (aber nicht das Hinzufügen / Entfernen eines Schlüssels) wird die Reihenfolge beeinflussen, das ist, was die Kommentare in der C-Quelle sagt:

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

Es scheint, dass es nicht eine Implementierung Detail, sondern eine Forderung der Sprache.

Sofern nicht Änderungen an dem Wörterbuch gemacht werden, ist die Antwort ja. Siehe die Dokumentation hier .

Allerdings Wörterbücher sind von Natur aus in Python ungeordnet. Im Allgemeinen ist es nicht die beste Praxis auf Wörterbücher für sensible sortierten Daten verlassen kann.

Ein Beispiel für eine eine robustere Lösung wäre Djangos SortedDict Datenstruktur .

Wenn Sie die Reihenfolge konsistent sein wollen, würde ich etwas tun, um eine bestimmte Reihenfolge zu erzwingen. Obwohl Sie sich selbst davon zu überzeugen, vielleicht in der Lage, dass die Reihenfolge gewährleistet ist, und Sie könnten recht haben, scheint es mir, zerbrechlich, und es wird an andere Entwickler mysteriös sein.

Zum Beispiel Sie betonen immer in Ihrer Frage. Ist es wichtig, dass es die gleiche Reihenfolge in Python 2.5 und 2.6 sein? 2.6 und 3.1? CPython und Jython? Ich würde nicht auf diejenigen zählen.

Ich würde auch nicht unter Berufung auf die Tatsache, empfehlen die Wörterbücher, um nicht zufällig.

Wenn Sie ein in Lösung gebaut wollen Sortierung Sie lesen Wörterbuch http: // www .python.org / dev / pep / pep-0265 /

Hier ist das relevanteste Material:

Das PEP wird abgelehnt, da die Notwendigkeit für sie weitgehend gewesen     erfüllt von Py2.4 die sortiert () eingebaute Funktion:

    >>> 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)]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top