سؤال

أقوم حاليًا بتنفيذ شبكة غذائية ميكروبية معقدة باستخدام لغة بايثون 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<timeToSolve:
         o.integrate()

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

لذا، السؤال هو، عندما أراجع القواميس الموجودة Species.sumOverAllReactionsForThisSpecies() و FermentationChamber.step(), ، هل ترتيب التكرار للقواميس مضمون أن يكون هو نفسه إذا لم تتم إضافة أو إزالة أي عناصر من القواميس بين التكرار الأول والأخير؟بمعنى، هل يمكنني أن أفترض أن ترتيب المصفوفة numpy التي تم إنشاؤها في كل تكرار من القاموس لن يختلف؟على سبيل المثال، إذا كان القاموس بالتنسيق {'Glucose':10, 'Fructose':12}، إذا تم إنشاء مصفوفة من هذا القاموس دائماً لها نفس الترتيب (لا يهم ما هو هذا الترتيب، طالما أنه حتمي).

آسف على هذا المنشور الضخم، أردت فقط أن أخبرك من أين أتيت.

هل كانت مفيدة؟

المحلول

وبيثون 3.1 لديه collections.OrderedDict الدرجة التي يمكن أن تكون تستخدم لهذا الغرض. انها فعالة جدا، جدا: "بيغ-O تشغيل الأوقات لجميع الطرق هي نفس القواميس العادية"

رمز لOrderedDict نفسها متوافق مع بيثون الإصدار 2.x، على الرغم من بعض الأساليب الموروثة (من في _ abcoll وحدة) القيام استخدام بايثون يضم 3 فقط. ومع ذلك، فإنها يمكن تعديلها لالإصدار 2.x الرمز مع الحد الأدنى من الجهد.

نصائح أخرى

نعم، نفس الطلب مضمون إذا لم يتم تعديله.

انظر المستندات هنا.

يحرر:

فيما يتعلق بما إذا كان تغيير القيمة (ولكن ليس إضافة/إزالة مفتاح) سيؤثر على الترتيب، فهذا ما تقوله التعليقات في مصدر C:

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

يبدو أن هذه ليست تفاصيل تنفيذ، ولكنها متطلبات اللغة.

وقدمت <م> لا يتم إجراء تعديلات إلى القاموس، فإن الجواب هو نعم. اطلع على مستندات هنا .

ولكن، وغير مرتبة القواميس بطبيعتها في بيثون. بشكل عام، انها ليست أفضل الممارسات في الاعتماد على قواميس للبيانات التي تم فرزها الحساس.

ومثال على حل أكثر قوة سيكون جانغو SortedDict بنية بيانات .

إذا كنت تريد لكي تكون متسقة، وأود أن تفعل شيئا لفرض ترتيب معين. على الرغم من أنك قد تكون قادرة على إقناع نفسك أن يضمن النظام، وكنت قد يكون على حق، يبدو هشا لي، وسيكون غامض لمطورين آخرين.

وعلى سبيل المثال، تؤكد <م> دائما في سؤالك. غير أن من المهم أن يكون من نفس النظام في بيثون 2.5 و 2.6؟ 2.6 و 3.1؟ سي بايثون وجيثون؟ وأود أن لا نعول على هؤلاء.

وأود أيضا أن يوصي لا تعتمد على حقيقة الأمر القواميس هو غير عشوائي.

إذا كنت تريد بنيت في حل لفرز أنت قاموس قراءة HTTP: // شبكة الاتصالات العالمية .python.org / ديف / ممثلي المخاطر / الحماسي-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)]
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top