উত্তর:
এটি খুব বিস্তৃতভাবে পরীক্ষা করা হয়নি, তবে পাইথন ২.২.২ এ কাজ করে।
>>> d = {"x":2, "h":15, "a":2222}
>>> it = iter(sorted(d.iteritems()))
>>> it.next()
('a', 2222)
>>> it.next()
('h', 15)
>>> it.next()
('x', 2)
>>>
যদি আপনি for key, value in d.iteritems(): ...
পুনরাবৃত্তির পরিবর্তে করতে অভ্যস্ত হন তবে এটি উপরের সমাধানটির সাথে এখনও কাজ করবে
>>> d = {"x":2, "h":15, "a":2222}
>>> for key, value in sorted(d.iteritems()):
>>> print(key, value)
('a', 2222)
('h', 15)
('x', 2)
>>>
পাইথন ৩.x এর সাহায্যে পুনরুদ্ধারের d.items()
পরিবর্তে ব্যবহার করুন d.iteritems()
।
items()
একটি তালিকা তৈরি করে এবং তাই মেমরি iteritems()
ব্যবহার করে , যেখানে মূলত মেমরি ব্যবহার করে না। কী ব্যবহার করবেন তা মূলত অভিধানের আকারের উপর নির্ভর করে। উপরন্তু, স্বয়ংক্রিয় পাইথন 2 পাইথন 3 কনভার্সন টুল করার জন্য ( 2to3
) স্বয়ংক্রিয়ভাবে থেকে রুপান্তরের যত্ন নেয় iteritems()
করার items()
, তাই এই সম্পর্কে চিন্তা করতে কোন প্রয়োজন নেই।
collections.OrderedDict
আপনি একবার বাছাই করুন এবং আইটেমগুলি সর্বদা সাজানো ক্রমে ব্যবহার করুন।
iteritems()
মেমোরি ব্যবহার না করলেও , সমস্ত কিছু অবশ্যই মেমরির মধ্যে টানতে হবে sorted()
, তাই এখানে items()
এবং iteritems()
স্মৃতি ভিত্তিক ব্যবহারের মধ্যে কোনও পার্থক্য নেই ।
items()
(যে তালিকার মাধ্যমে ফিরে এসেছে items()
, এবং সাজানো তালিকায় রয়েছে) এবং কেবল একবার iteritems()
(কেবল বাছাই করা তালিকায়) দিয়ে।
sorted()
ফাংশনটি ব্যবহার করুন :
return sorted(dict.iteritems())
আপনি যদি সাজানো ফলাফলের চেয়ে প্রকৃত পুনরাবৃত্তি চান, যেহেতু sorted()
একটি তালিকা প্রত্যাবর্তন করে, ব্যবহার করুন:
return iter(sorted(dict.iteritems()))
একটি ডিকের কীগুলি হ্যাশটেবলে সংরক্ষণ করা হয় যাতে এটি তাদের 'প্রাকৃতিক আদেশ', অর্থাত্ পিচিউডো-এলোমেলো। অন্য কোনও অর্ডার হ'ল ডিকের ভোক্তার ধারণা।
সাজানো () সর্বদা একটি ডিক্ট নয়, একটি তালিকা দেয় returns যদি আপনি এটি একটি ডিক.ইটেমস () (যা টিপলগুলির একটি তালিকা তৈরি করে) পাস করে তবে এটি টিউপসগুলির একটি তালিকা [(কে 1, ভি 1), (কে 2, ভি 2), ...] ফিরিয়ে দেবে যা একটি লুপে ব্যবহার করা যেতে পারে একরকমভাবে ডিকের মতো, তবে তা কোনওভাবেই ডিক্টের মতো নয় !
foo = {
'a': 1,
'b': 2,
'c': 3,
}
print foo
>>> {'a': 1, 'c': 3, 'b': 2}
print foo.items()
>>> [('a', 1), ('c', 3), ('b', 2)]
print sorted(foo.items())
>>> [('a', 1), ('b', 2), ('c', 3)]
নিম্নলিখিতগুলি লুপে ডিকের মতো অনুভূত হয় তবে এটি নয়, এটি কে, ভিতে প্যাকযুক্ত পশুর তালিকা রয়েছে:
for k,v in sorted(foo.items()):
print k, v
মোটামুটি সমান:
for k in sorted(foo.keys()):
print k, foo[k]
sorted(foo.keys())
সমতুল্য হিসাবে ভাল sorted(foo)
, যেহেতু অভিধানগুলি তাদের পুনরুক্তিগুলি পুনরুক্ত করার সময় তাদের কীগুলি ফিরিয়ে দেয় ( foo.keys()
মধ্যবর্তী তালিকা তৈরি করতে বাধ্য করা না হওয়ার সুবিধার সাথে , সম্ভবত — sorted()
পুনরাবৃত্তির জন্য কীভাবে প্রয়োগ করা হয় তার উপর নির্ভর করে )।
k in sorted(foo.keys()):
যা আশ্চর্যজনক যা কীগুলি টানতে পারে বা for k,v in sorted(foo.items()):
অভিধানের তালিকার sorted(foo.keys())
আপনি এখন OrderedDict
পাইথন ২.7 এও ব্যবহার করতে পারেন :
>>> from collections import OrderedDict
>>> d = OrderedDict([('first', 1),
... ('second', 2),
... ('third', 3)])
>>> d.items()
[('first', 1), ('second', 2), ('third', 3)]
এখানে আপনার কাছে 2.7 সংস্করণ এবং অর্ডারডিক্ট এপিআই এর নতুন পৃষ্ঠাটি রয়েছে ।
সাধারণভাবে, কেউ এর মতো একটি ডিক বাছাই করতে পারে:
for k in sorted(d):
print k, d[k]
প্রশ্নের নির্দিষ্ট ক্ষেত্রে, d.iteitems () এর জন্য "ড্রপ রিপ্লেসমেন্ট" থাকার জন্য, একটি ফাংশন যুক্ত করুন:
def sortdict(d, **opts):
# **opts so any currently supported sorted() options can be passed
for k in sorted(d, **opts):
yield k, d[k]
এবং তাই শেষ লাইন থেকে পরিবর্তন
return dict.iteritems()
প্রতি
return sortdict(dict)
অথবা
return sortdict(dict, reverse = True)
>>> import heapq
>>> d = {"c": 2, "b": 9, "a": 4, "d": 8}
>>> def iter_sorted(d):
keys = list(d)
heapq.heapify(keys) # Transforms to heap in O(N) time
while keys:
k = heapq.heappop(keys) # takes O(log n) time
yield (k, d[k])
>>> i = iter_sorted(d)
>>> for x in i:
print x
('a', 4)
('b', 9)
('c', 2)
('d', 8)
এই পদ্ধতিটিতে এখনও একটি ও (এন লগ এন) বাছাই রয়েছে, তবে একটি সংক্ষিপ্ত রৈখিক হিপিফাইয়ের পরে এটি সাজানো ক্রমে আইটেমগুলি ফলিত হয়, এটি আপনাকে তাত্ত্বিকভাবে আরও দক্ষ করে তোলে যখন আপনাকে সর্বদা পুরো তালিকার প্রয়োজন হয় না।
আপনি কীগুলির ক্রমের পরিবর্তে আইটেমগুলি সন্নিবেশ করানো হয়েছে এমন ক্রম অনুসারে বাছাই করতে চাইলে পাইথনের সংগ্রহগুলিতে আপনার নজর রাখা উচিত rআরআর্টডিক্ট । (পাইথন 3 কেবল)
বাছাই করা একটি তালিকা দেয়, সুতরাং আপনার ত্রুটি যখন আপনি এটির পুনরাবৃত্তি করার চেষ্টা করেন তবে আপনি কোনও ডিক অর্ডার করতে না পেরে আপনাকে একটি তালিকা মোকাবেলা করতে হবে।
আপনার কোডের বৃহত্তর প্রসঙ্গটি কী তা আমার কোনও ধারণা নেই তবে আপনি ফলাফলের তালিকায় একটি পুনরাবৃত্তি যুক্ত করার চেষ্টা করতে পারেন। এই মত হতে পারে ?:
return iter(sorted(dict.iteritems()))
অবশ্যই আপনি এখন টিউপস ফিরে পাবেন কারণ সাজানো আপনার ডিককে টিপলগুলির তালিকায় পরিণত করেছে
উদাহরণস্বরূপ: বলুন আপনার ডিকটি ছিল:
{'a':1,'c':3,'b':2}
সাজানো এটিকে তালিকায় পরিণত করে:
[('a',1),('b',2),('c',3)]
সুতরাং আপনি যখন তালিকার উপরে পুনরাবৃত্তি করবেন তখন আপনি ফিরে পাবেন (উদাহরণস্বরূপ) একটি স্ট্রিং এবং একটি পূর্ণসংখ্যার সমন্বিত একটি দ্বিখণ্ডিত, তবে কমপক্ষে আপনি এটির উপরে পুনরাবৃত্তি করতে সক্ষম হবেন।
ধরে নিই যে আপনি সিপিথন ২.x ব্যবহার করছেন এবং আপনার একটি বৃহত অভিধানের মাইডিক্ট রয়েছে, তারপরে বাছাই করা (মাইডিক্ট) ধীর হতে চলেছে কারণ সাজানো মাইডিক্টের কীগুলির একটি সাজানো তালিকা তৈরি করে।
সেক্ষেত্রে আপনি আমার অর্ডারডিক্ট প্যাকেজটি দেখতে চাইতে পারেন যা সি এর সি বাস্তবায়ন অন্তর্ভুক্ত sorteddict
করে বিশেষত আপনি যদি অভিধানের আজীবন বিভিন্ন স্তরে (অর্থাত্ উপাদানগুলির সংখ্যা) একাধিকবার চাবিগুলির বাছাই করা তালিকাটি দেখতে চান।
.items()
পরিবর্তে ব্যবহার করুনiteritems()
: যেমন ক্লাডিউ বলেছেন, ইটারাইটাম পাইথন ৩.x এর জন্য কাজ করে না, তবেitems()
পাইথন ২.6 থেকে পাওয়া যায়।