كيف يمكنك استرداد العناصر من القاموس بالترتيب الذي تم إدراجها به؟

StackOverflow https://stackoverflow.com/questions/60848

  •  09-06-2019
  •  | 
  •  

سؤال

هل من الممكن استرداد العناصر من قاموس بايثون بالترتيب الذي تم إدراجها به؟

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

المحلول

بايثون القياسية dict يقوم بذلك افتراضيًا إذا كنت تستخدم CPython 3.6+ (أو Python 3.7+ لأي تطبيق آخر لـ Python).

في الإصدارات الأقدم من Python يمكنك استخدامها collections.OrderedDict.

نصائح أخرى

الإجابات الأخرى صحيحة.هذا غير ممكن، ولكن يمكنك كتابة هذا بنفسك.ومع ذلك، في حال لم تكن متأكدًا من كيفية تنفيذ شيء كهذا فعليًا، فإليك تطبيق كامل وعملي تحدده الفئات الفرعية والذي كتبته واختبرته للتو.(لاحظ أن ترتيب القيم التي تم تمريرها إلى المنشئ غير محدد ولكنه سيأتي قبل القيم التي تم تمريرها لاحقًا، ويمكنك دائمًا عدم السماح بتهيئة الإملاءات المرتبة بالقيم.)

class ordered_dict(dict):
    def __init__(self, *args, **kwargs):
        dict.__init__(self, *args, **kwargs)
        self._order = self.keys()

    def __setitem__(self, key, value):
        dict.__setitem__(self, key, value)
        if key in self._order:
            self._order.remove(key)
        self._order.append(key)

    def __delitem__(self, key):
        dict.__delitem__(self, key)
        self._order.remove(key)

    def order(self):
        return self._order[:]

    def ordered_items(self):
        return [(key,self[key]) for key in self._order]


od = ordered_dict()
od["hello"] = "world"
od["goodbye"] = "cruel world"
print od.order()            # prints ['hello', 'goodbye']

del od["hello"]
od["monty"] = "python"
print od.order()            # prints ['goodbye', 'monty']

od["hello"] = "kitty"
print od.order()            # prints ['goodbye', 'monty', 'hello']

print od.ordered_items()
# prints [('goodbye','cruel world'), ('monty','python'), ('hello','kitty')]

استخدم OrderedDict()، وهو متاح منذ الإصدار 2.7

مجرد مسألة فضول:

from collections import OrderedDict
a = {}
b = OrderedDict()
c = OredredDict()

a['key1'] = 'value1'
a['key2'] = 'value2'

b['key1'] = 'value1'
b['key2'] = 'value2'

c['key2'] = 'value2'
c['key1'] = 'value1'

print a == b #True
print a == c #True
print b == c #False

أو، فقط اجعل المفتاح صفًا باستخدام time.now()‎ باعتباره الحقل الأول في الصف.

ثم يمكنك استرداد المفاتيح باستخدام dictname.keys()، والفرز، وفويلا!

جيري

اعتبارًا من Python 3.7، يحافظ الإملاء القياسي على ترتيب الإدراج.من مستندات:

تم التغيير في الإصدار 3.7:ترتيب القاموس مضمون ليكون أمر الإدراج.كان هذا السلوك بمثابة تفاصيل تنفيذ CPython من 3.6.

لذا، يجب أن تكون قادرًا على تكرار القاموس بشكل طبيعي أو استخدامه popitem().

لا يمكنك القيام بذلك باستخدام فئة الإملاء الأساسية - فهي مرتبة حسب التجزئة.يمكنك إنشاء قاموسك الخاص الذي يكون في الواقع قائمة بالمفاتيح أو أزواج القيمة أو ما شابه ذلك، والتي سيتم ترتيبها.

لقد استخدمت StableDict من قبل بنجاح جيد.

http://pypi.python.org/pypi/StableDict/0.2

أو استخدم أيًا من تطبيقات بيب-372 الموصوفة هنا, ، مثل ال وحدة غريبة من com.pythonutils.

لقد استخدمت تطبيق pocoo.org بنجاح، فهو سهل مثل استبدال ملف

my_dict={}
my_dict["foo"]="bar"

مع

my_dict=odict.odict()
my_dict["foo"]="bar"

وتتطلب فقط هذا الملف

هذا غير ممكن إلا إذا قمت بتخزين المفاتيح في قائمة منفصلة للرجوع إليها لاحقًا.

ما يمكنك فعله هو إدخال القيم باستخدام مفتاح يمثل الترتيب المُدخل، ثم الاتصال sorted() على العناصر.

>>> obj = {}
>>> obj[1] = 'Bob'
>>> obj[2] = 'Sally'
>>> obj[3] = 'Joe'
>>> for k, v in sorted(obj.items()):
...     print v
... 
Bob
Sally
Joe
>>> 

إذا لم تكن بحاجة إلى وظيفة الإملاء، وتحتاج فقط إلى إرجاع الصفوف بالترتيب الذي أدخلتها به، ألن تعمل قائمة الانتظار بشكل أفضل؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top