পাইথনে, আমি কীভাবে সাজানো কী ক্রমে একটি অভিধানে পুনরাবৃত্তি করব?


211

একটি বিদ্যমান ফাংশন রয়েছে যা নিম্নলিখিতটিতে শেষ হয়, যেখানে dএকটি অভিধান রয়েছে:

return d.iteritems()

এটি একটি প্রদত্ত অভিধানের জন্য একটি অরক্ষিত পুনরাবৃত্তি প্রদান করে। আমি একটি পুনরুক্তি করতে চাই যা কী অনুসারে বাছাই করা আইটেমগুলির মধ্য দিয়ে যায় । আমি কেমন করে ঐটি করি?

উত্তর:


171

এটি খুব বিস্তৃতভাবে পরীক্ষা করা হয়নি, তবে পাইথন ২.২.২ এ কাজ করে।

>>> 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()


29
.items()পরিবর্তে ব্যবহার করুন iteritems(): যেমন ক্লাডিউ বলেছেন, ইটারাইটাম পাইথন ৩.x এর জন্য কাজ করে না, তবে items()পাইথন ২.6 থেকে পাওয়া যায়।
রেমি

40
এটা সুস্পষ্ট নয়। আসলে, items()একটি তালিকা তৈরি করে এবং তাই মেমরি iteritems()ব্যবহার করে , যেখানে মূলত মেমরি ব্যবহার করে না। কী ব্যবহার করবেন তা মূলত অভিধানের আকারের উপর নির্ভর করে। উপরন্তু, স্বয়ংক্রিয় পাইথন 2 পাইথন 3 কনভার্সন টুল করার জন্য ( 2to3) স্বয়ংক্রিয়ভাবে থেকে রুপান্তরের যত্ন নেয় iteritems()করার items(), তাই এই সম্পর্কে চিন্তা করতে কোন প্রয়োজন নেই।
এরিক ও লেবিগোট

5
@ হাওয়ারহেল collections.OrderedDictআপনি একবার বাছাই করুন এবং আইটেমগুলি সর্বদা সাজানো ক্রমে ব্যবহার করুন।
মার্ক হারভিস্টন

9
তবে @ ইওল, iteritems()মেমোরি ব্যবহার না করলেও , সমস্ত কিছু অবশ্যই মেমরির মধ্যে টানতে হবে sorted(), তাই এখানে items()এবং iteritems()স্মৃতি ভিত্তিক ব্যবহারের মধ্যে কোনও পার্থক্য নেই ।
রিচার্ড

8
@ রিচার্ড: যদিও এটি সত্য যে সমস্ত উপাদান অবশ্যই স্মৃতিতে টানতে হবে, সেগুলি দুটি দিয়ে সংরক্ষণ করা হয়েছে items()(যে তালিকার মাধ্যমে ফিরে এসেছে items(), এবং সাজানো তালিকায় রয়েছে) এবং কেবল একবার iteritems()(কেবল বাছাই করা তালিকায়) দিয়ে।
এরিক হে লেবিগোট

83

sorted()ফাংশনটি ব্যবহার করুন :

return sorted(dict.iteritems())

আপনি যদি সাজানো ফলাফলের চেয়ে প্রকৃত পুনরাবৃত্তি চান, যেহেতু sorted()একটি তালিকা প্রত্যাবর্তন করে, ব্যবহার করুন:

return iter(sorted(dict.iteritems()))

এটি আমার জন্য ব্যর্থ: <টাইপ 'ব্যাতিক্রম T টাইপ-এরর'>: ইটার () 'তালিকা' টাইপের নন-ইটারেটর ফিরিয়ে দিয়েছে
মাইক

সম্ভবত কারণ আপনি ভেরিয়েবল নাম হিসাবে "ডিক" ব্যবহার করেন। "ডিক" আসলে অভিধানের টাইপ নাম। এখানে কেবল "mydict" এর মতো অন্য নাম এবং ভয়েলা ব্যবহার করুন।
উত্কু_করটাস

1
এখনও কাজ করছে না. আপনি কি ইতিবাচকভাবে সাজানো () নিয়মিত তালিকার বিপরীতে অন্য পুনরাবৃত্তিকে ফেরত দেন?
মাইক

কখন এবং কোথায় এই ব্যতিক্রম ঘটে? আপনি কোনও সমস্যা ছাড়াই একটি তালিকাতে পুনরাবৃত্তি করতে পারেন

1
রাজি, হপ আমি মনে করি না যে আমি কখনই ফাইলগুলিতে লাইন ছেড়ে যাওয়া ছাড়া সরাসরি .next () কল করি। আমাদের ইটার (সাজানো (ডিক্টিমিটারাইটেমস ()) সমাধানটি "সাজানো (" পর্যায়ে যাইহোক, মেমরির ক্ষেত্রে পুরো ডিকের একটি অনুলিপি তৈরি করে শেষ হয়, তাই প্রাথমিক

39

একটি ডিকের কীগুলি হ্যাশটেবলে সংরক্ষণ করা হয় যাতে এটি তাদের 'প্রাকৃতিক আদেশ', অর্থাত্ পিচিউডো-এলোমেলো। অন্য কোনও অর্ডার হ'ল ডিকের ভোক্তার ধারণা।

সাজানো () সর্বদা একটি ডিক্ট নয়, একটি তালিকা দেয় 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]

ঠিক আছে, তবে আমি একটি ডিক্ট বা একটি তালিকা চাই না, আমি একটি ইলেটর চাই। আমি কীভাবে এটিকে একজন পরীক্ষক হিসাবে জোর করতে পারি?
মাইক

2
sorted(foo.keys())সমতুল্য হিসাবে ভাল sorted(foo), যেহেতু অভিধানগুলি তাদের পুনরুক্তিগুলি পুনরুক্ত করার সময় তাদের কীগুলি ফিরিয়ে দেয় ( foo.keys()মধ্যবর্তী তালিকা তৈরি করতে বাধ্য করা না হওয়ার সুবিধার সাথে , সম্ভবত — sorted()পুনরাবৃত্তির জন্য কীভাবে প্রয়োগ করা হয় তার উপর নির্ভর করে )।
এরিক হে লেবিগোট

গতি এবং / অথবা মেমরির জন্য আরও ভাল k in sorted(foo.keys()):যা আশ্চর্যজনক যা কীগুলি টানতে পারে বা for k,v in sorted(foo.items()):অভিধানের তালিকার sorted(foo.keys())
জোড়গুলির

1
@ ক্র্যান্ডেল ডাব্লুএস: সময় প্রশ্নের উত্তর দেওয়ার সর্বোত্তম উপায় হলেন পাইথন টাইমিট মডিউল।
পিটার রোয়েল

1
@ ফ্র্যাঙ্ক - সংক্ষিপ্ত উত্তর: নং ডিক হ'ল একটি অ্যারে যা প্রকৃত কী সরবরাহিত কীটির মানের একটি হ্যাশ । যদিও কিছু বাস্তবায়নগুলি মোটামুটি অনুমানযোগ্য হতে পারে এবং কেউ কেউ এই চুক্তিও করতে পারে তবে হ্যাশ অর্ডার দেওয়ার সময় আমি কিছুই মনে করি না count 3.6+ আচরণের জন্য আরও এই পোস্টটি দেখুন । বিশেষভাবে প্রথম উত্তরটি নোট করুন।
পিটার রওয়েল

31

গ্রেগ উত্তর সঠিক। দ্রষ্টব্য যে পাইথন 3.0 এ আপনাকে করতে হবে

sorted(dict.items())

যেমন iteritemsচলে যাবে।


এটি আমার জন্য ব্যর্থ: <টাইপ 'ব্যাতিক্রম T টাইপ-এরর'>: ইটার () 'তালিকা' টাইপের নন-ইটারেটর ফিরিয়ে দিয়েছে
মাইকে

3
"গাড়ি ব্যবহার করবেন না কারণ ভবিষ্যতে আমাদের হোভার বোর্ড থাকবে"
জেজে

7

আপনি এখন OrderedDictপাইথন ২.7 এও ব্যবহার করতে পারেন :

>>> from collections import OrderedDict
>>> d = OrderedDict([('first', 1),
...                  ('second', 2),
...                  ('third', 3)])
>>> d.items()
[('first', 1), ('second', 2), ('third', 3)]

এখানে আপনার কাছে 2.7 সংস্করণ এবং অর্ডারডিক্ট এপিআই এর নতুন পৃষ্ঠাটি রয়েছে ।


এটি কী প্রদান করবে, মানগুলি যেভাবে সন্নিবেশ করা হয়েছে সেগুলি - কোনও সাজানো ক্রমে নয় (অর্থাত্ বর্ণমালা) নয়।
টনি সাফলক 66

5

সাধারণভাবে, কেউ এর মতো একটি ডিক বাছাই করতে পারে:

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)

5
>>> 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)

এই পদ্ধতিটিতে এখনও একটি ও (এন লগ এন) বাছাই রয়েছে, তবে একটি সংক্ষিপ্ত রৈখিক হিপিফাইয়ের পরে এটি সাজানো ক্রমে আইটেমগুলি ফলিত হয়, এটি আপনাকে তাত্ত্বিকভাবে আরও দক্ষ করে তোলে যখন আপনাকে সর্বদা পুরো তালিকার প্রয়োজন হয় না।


4

আপনি কীগুলির ক্রমের পরিবর্তে আইটেমগুলি সন্নিবেশ করানো হয়েছে এমন ক্রম অনুসারে বাছাই করতে চাইলে পাইথনের সংগ্রহগুলিতে আপনার নজর রাখা উচিত rআরআর্টডিক্ট । (পাইথন 3 কেবল)


3

বাছাই করা একটি তালিকা দেয়, সুতরাং আপনার ত্রুটি যখন আপনি এটির পুনরাবৃত্তি করার চেষ্টা করেন তবে আপনি কোনও ডিক অর্ডার করতে না পেরে আপনাকে একটি তালিকা মোকাবেলা করতে হবে।

আপনার কোডের বৃহত্তর প্রসঙ্গটি কী তা আমার কোনও ধারণা নেই তবে আপনি ফলাফলের তালিকায় একটি পুনরাবৃত্তি যুক্ত করার চেষ্টা করতে পারেন। এই মত হতে পারে ?:

return iter(sorted(dict.iteritems()))

অবশ্যই আপনি এখন টিউপস ফিরে পাবেন কারণ সাজানো আপনার ডিককে টিপলগুলির তালিকায় পরিণত করেছে

উদাহরণস্বরূপ: বলুন আপনার ডিকটি ছিল: {'a':1,'c':3,'b':2} সাজানো এটিকে তালিকায় পরিণত করে:

[('a',1),('b',2),('c',3)]

সুতরাং আপনি যখন তালিকার উপরে পুনরাবৃত্তি করবেন তখন আপনি ফিরে পাবেন (উদাহরণস্বরূপ) একটি স্ট্রিং এবং একটি পূর্ণসংখ্যার সমন্বিত একটি দ্বিখণ্ডিত, তবে কমপক্ষে আপনি এটির উপরে পুনরাবৃত্তি করতে সক্ষম হবেন।


2

ধরে নিই যে আপনি সিপিথন ২.x ব্যবহার করছেন এবং আপনার একটি বৃহত অভিধানের মাইডিক্ট রয়েছে, তারপরে বাছাই করা (মাইডিক্ট) ধীর হতে চলেছে কারণ সাজানো মাইডিক্টের কীগুলির একটি সাজানো তালিকা তৈরি করে।

সেক্ষেত্রে আপনি আমার অর্ডারডিক্ট প্যাকেজটি দেখতে চাইতে পারেন যা সি এর সি বাস্তবায়ন অন্তর্ভুক্ত sorteddictকরে বিশেষত আপনি যদি অভিধানের আজীবন বিভিন্ন স্তরে (অর্থাত্‍ উপাদানগুলির সংখ্যা) একাধিকবার চাবিগুলির বাছাই করা তালিকাটি দেখতে চান।

http://anthon.home.xs4all.nl/Python/ordereddict/

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.