পাইথন ২ এ করার জন্য কোনও অন্তর্নির্মিত পদ্ধতি নেই you আপনার যদি এটির প্রয়োজন হয় তবে আপনাকে একটি prepend()
পদ্ধতি / ফাংশন লিখতে হবে যা OrderedDict
হে (1) জটিলতার সাথে ইন্টার্নালগুলিতে পরিচালনা করে ।
পাইথন ৩.২ এবং তার পরে আপনার এই পদ্ধতিটি ব্যবহার করা উচিত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) ব্যবহার করুন
পাইথন ৩.২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')])
আমাদের যদি কোনও উপাদান sertোকাতে এবং এটিকে শীর্ষে স্থানান্তরিত করতে হয় তবে সমস্ত এক ধাপে, আমরা সরাসরি এটি একটি 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')])