पायथन 2 में ऐसा करने के लिए कोई अंतर्निहित पद्धति नहीं है। यदि आपको इसकी आवश्यकता है, तो आपको एक prepend()
विधि / फ़ंक्शन लिखना होगा जो OrderedDict
ओ (1) जटिलता के साथ आंतरिक पर संचालित होता है।
पायथन 3.2 और बाद के लिए, आपको विधि का उपयोग करना चाहिएmove_to_end
। विधि एक last
तर्क को स्वीकार करती है जो इंगित करता है कि तत्व को नीचे ( last=True
) या ऊपर ( last=False
) के लिए स्थानांतरित किया जाएगा OrderedDict
।
अंत में, यदि आप एक त्वरित, गंदा और धीमा समाधान चाहते हैं, तो आप केवल OrderedDict
खरोंच से एक नया बना सकते हैं ।
चार अलग-अलग समाधानों के लिए विवरण:
OrderedDict
एक नई आवृत्ति विधि बढ़ाएँ और जोड़ें
from collections import OrderedDict
class MyOrderedDict(OrderedDict):
def prepend(self, key, value, dict_setitem=dict.__setitem__):
root = self._OrderedDict__root
first = root[1]
if key in self:
link = self._OrderedDict__map[key]
link_prev, link_next, _ = link
link_prev[1] = link_next
link_next[0] = link_prev
link[0] = root
link[1] = first
root[1] = first[0] = link
else:
root[1] = first[0] = self._OrderedDict__map[key] = [root, first, key]
dict_setitem(self, key, value)
डेमो:
>>> d = MyOrderedDict([('a', '1'), ('b', '2')])
>>> d
MyOrderedDict([('a', '1'), ('b', '2')])
>>> d.prepend('c', 100)
>>> d
MyOrderedDict([('c', 100), ('a', '1'), ('b', '2')])
>>> d.prepend('a', d['a'])
>>> d
MyOrderedDict([('a', '1'), ('c', 100), ('b', '2')])
>>> d.prepend('d', 200)
>>> d
MyOrderedDict([('d', 200), ('a', '1'), ('c', 100), ('b', '2')])
स्टैंडअलोन फ़ंक्शन जो OrderedDict
ऑब्जेक्ट्स में हेरफेर करता है
यह कार्य तानाशाही वस्तु, कुंजी और मूल्य को स्वीकार करके एक ही काम करता है। मैं व्यक्तिगत रूप से वर्ग को पसंद करता हूं:
from collections import OrderedDict
def ordered_dict_prepend(dct, key, value, dict_setitem=dict.__setitem__):
root = dct._OrderedDict__root
first = root[1]
if key in dct:
link = dct._OrderedDict__map[key]
link_prev, link_next, _ = link
link_prev[1] = link_next
link_next[0] = link_prev
link[0] = root
link[1] = first
root[1] = first[0] = link
else:
root[1] = first[0] = dct._OrderedDict__map[key] = [root, first, key]
dict_setitem(dct, key, value)
डेमो:
>>> d = OrderedDict([('a', '1'), ('b', '2')])
>>> ordered_dict_prepend(d, 'c', 100)
>>> d
OrderedDict([('c', 100), ('a', '1'), ('b', '2')])
>>> ordered_dict_prepend(d, 'a', d['a'])
>>> d
OrderedDict([('a', '1'), ('c', 100), ('b', '2')])
>>> ordered_dict_prepend(d, 'd', 500)
>>> d
OrderedDict([('d', 500), ('a', '1'), ('c', 100), ('b', '2')])
उपयोग करें OrderedDict.move_to_end()
(पायथन> = 3.2)
पायथन 3.2 नेOrderedDict.move_to_end()
विधि पेश की । इसका उपयोग करके, हम ओ (1) समय में शब्दकोश के अंत में एक मौजूदा कुंजी को स्थानांतरित कर सकते हैं।
>>> d1 = OrderedDict([('a', '1'), ('b', '2')])
>>> d1.update({'c':'3'})
>>> d1.move_to_end('c', last=False)
>>> d1
OrderedDict([('c', '3'), ('a', '1'), ('b', '2')])
यदि हमें एक तत्व सम्मिलित करने और इसे शीर्ष पर ले जाने की आवश्यकता है, तो सभी एक चरण में, हम सीधे एक prepend()
आवरण बनाने के लिए इसका उपयोग कर सकते हैं (यहां प्रस्तुत नहीं)।
एक नया बनाएँ OrderedDict
- धीमा !!!
यदि आप ऐसा नहीं करना चाहते हैं और प्रदर्शन एक मुद्दा नहीं है, तो सबसे आसान तरीका एक नया तानाशाही बनाना है:
from itertools import chain, ifilterfalse
from collections import OrderedDict
def unique_everseen(iterable, key=None):
"List unique elements, preserving order. Remember all elements ever seen."
seen = set()
seen_add = seen.add
if key is None:
for element in ifilterfalse(seen.__contains__, iterable):
seen_add(element)
yield element
else:
for element in iterable:
k = key(element)
if k not in seen:
seen_add(k)
yield element
d1 = OrderedDict([('a', '1'), ('b', '2'),('c', 4)])
d2 = OrderedDict([('c', 3), ('e', 5)])
new_dic = OrderedDict((k, d2.get(k, d1.get(k))) for k in \
unique_everseen(chain(d2, d1)))
print new_dic
उत्पादन:
OrderedDict([('c', 3), ('e', 5), ('a', '1'), ('b', '2')])