অর্ডডিক্টে ডিক রূপান্তর করা


138

collections.OrderedDictক্লাসটি ব্যবহার করতে আমার কিছুটা সমস্যা হচ্ছে । আমি রাস্পবিয়ানে পাইথন ২.7 ব্যবহার করছি, রাস্পবেরি পাইয়ের জন্য ডেবিয়ান ডিস্ট্রো। আমি পাঠ্য-দু: সাহসিকতার জন্য তুলনা করার জন্য দুটি পাশের অভিধান মুদ্রণের চেষ্টা করছি (পাশাপাশি)। সঠিকভাবে তুলনা করার জন্য আদেশটি প্রয়োজনীয়। আমি অভিধানগুলি কীভাবে চেষ্টা করেছি তা তাদের নিয়মিতভাবে বিন্যস্ত পদ্ধতিতে মুদ্রণ করে।

আমার আরপিআই-তে এটি করার পরে আমি যা পাই তা এখানে:

import collections

ship = {"NAME": "Albatross",
         "HP":50,
         "BLASTERS":13,
         "THRUSTERS":18,
         "PRICE":250}

ship = collections.OrderedDict(ship)

print ship
# OrderedDict([('PRICE', 250), ('HP', 50), ('NAME', 'Albatross'), ('BLASTERS', 13), ('THRUSTERS', 18)])

স্পষ্টতই এখানে কিছু ঠিক নেই কারণ এটি ফাংশন কলটি প্রিন্ট করছে এবং কীগুলি এবং মান গোষ্ঠীগুলিকে নেস্টেড তালিকায় রাখছে ...

এটি আমার পিসিতে অনুরূপ কিছু চালিয়ে আমি পেয়েছি:

import collections

Joe = {"Age": 28, "Race": "Latino", "Job": "Nurse"}
Bob = {"Age": 25, "Race": "White", "Job": "Mechanic", "Random": "stuff"}

#Just for clarity:
Joe = collections.OrderedDict(Joe)
Bob = collections.OrderedDict(Bob)

print Joe
# OrderedDict([('Age', 28), ('Race', 'Latino'), ('Job', 'Nurse')])
print Bob
# OrderedDict([('Age', 25), ('Race', 'White'), ('Job', 'Mechanic'), ('Random', 'stuff')])

এবার, এটি ক্রমযুক্ত, তবে এটি সঠিকভাবে অন্য জিনিসগুলি মুদ্রণ করা উচিত নয়? (এটি তালিকায় রাখা এবং ফাংশন কল দেখানো))

আমি কোথায় আমার ত্রুটি করছি? পাইথনের পাই সংস্করণটির সাথে কিছু করার দরকার নেই কারণ এটি কেবল লিনাক্স সংস্করণ।


3
দ্রষ্টব্য: OrderedDictসন্নিবেশ ক্রমের দ্বারা বাছাই করা হয়, বর্ণানুক্রমিক কী অর্ডার নয়।
el.pescado

উত্তর:


214

আপনি একটি অভিধান তৈরি করছেন প্রথম , তারপর যে অভিধান ক্ষণস্থায়ী OrderedDict। পাইথন সংস্করণ <3.6 (*) এর জন্য , আপনি যখন এটি করবেন তখন অর্ডারিং আর সঠিক হবে না। dictসহজাতভাবে আদেশ করা হয় না।

পরিবর্তে টিপলগুলির ক্রমে পাস করুন:

ship = [("NAME", "Albatross"),
        ("HP", 50),
        ("BLASTERS", 13),
        ("THRUSTERS", 18),
        ("PRICE", 250)]
ship = collections.OrderedDict(ship)

আপনি মুদ্রণ করার সময় আপনি যা দেখেন OrderedDictতা হ'ল এটি উপস্থাপনা এবং এটি সম্পূর্ণ সঠিক। OrderedDict([('PRICE', 250), ('HP', 50), ('NAME', 'Albatross'), ('BLASTERS', 13), ('THRUSTERS', 18)])শুধু একটি, আপনি দেখায় reproducable , উপস্থাপনা কি বিষয়বস্তুর হয় OrderedDict


(*) : সিপিথন ৩.6 বাস্তবায়নে, dictআরও বেশি মেমরি দক্ষ অভ্যন্তরীণ কাঠামো ব্যবহার করার জন্য টাইপটি আপডেট করা হয়েছিল যা সন্নিবেশ ক্রম সংরক্ষণের সুখী পার্শ্ব প্রতিক্রিয়া রয়েছে এবং প্রসারিতভাবে প্রশ্নটিতে প্রদর্শিত কোডটি ইস্যু ছাড়াই কাজ করে। পাইথন ৩.7 হিসাবে পাইথন ভাষার স্পেসিফিকেশন আপডেট করা হয়েছে যাতে প্রয়োজন যে সমস্ত পাইথন বাস্তবায়ন এই আচরণটি অনুসরণ করবে। দেখুন আমার এই অন্যান্য উত্তর বিস্তারিত জানার জন্য এবং কেন আপনি এখনও একটি ব্যবহার করতে পারেন চাই OrderedDict()নির্দিষ্ট ক্ষেত্রে জন্য।


ঠিক আছে সুতরাং অর্ডারডিক্ট আমার জন্য অভিধান তৈরি করবে? এছাড়াও, প্রজননযোগ্য উপস্থাপনা ছাড়াই মুদ্রণের জন্য আমি কী কেবল অর্ডারডটিকটি ব্যবহার করতে পারি তা মুদ্রণ করতে পারি? অর্থাৎ: print ship ?? ধন্যবাদ :)
পাইথনপিবয়

3
প্রশ্ন: আপনি যেভাবে বর্ণনা করেছেন, অর্ডারডিক্ট একটি আদেশযুক্ত "তালিকা" তৈরি করছে। এটা কি উদ্দেশ্যকে পরাজিত করে না? এটি কী এবং মানগুলির সাথে অভিধান নয়, কেবলমাত্র উপাদানের একটি তালিকা তৈরি করছে ...
পাইথনপিবয়

9
প্রকারটি উভয়ের মতোই কাজ করে; অর্ডার ধরে রাখে এমন একটি ম্যাপিং। অর্ডার সহ একটি তৈরি করতে, আপনাকে এটিকে ক্রমে আইটেমগুলি দিতে হবে । যেহেতু একটি স্ট্যান্ডার্ড ডিক (পিপিআই বা পাইথন ৩.+++ ব্যতীত অন্য কিছুতে) এটি না করতে পারে, আপনি তার পরিবর্তে এটি টিপলগুলির একটি তালিকা দিন। একবার OrderedDictহয় নির্মিত এটা হল একটি অভিধান।
মার্টিজন পিটারস

4
বিভ্রান্তির মতো শব্দগুলি অর্ডারডটিক্ট কেবল "অর্ডার" ধরে রাখার পরিবর্তে একটি অর্ডারকে "প্রয়োগ" করে ধরে নেওয়া থেকে শুরু করে। আমি অবশ্যই ধরে নিয়েছি এটি তৈরির পরে ইনপুটটি বাছাই করবে - বা আইটেমগুলি () ফাংশনটি whenোকানো হবে তা নির্বিশেষে সাজানো আইটেমগুলি ফিরিয়ে দেবে। পরিবর্তে এটি আপনার সরবরাহের যে কোনও আদেশ রাখে।
হোয়াইটুক 6

2
@ হুইটারুক 6: এটি কোনও সাজানো অভিধান নয়। এটি একটি অর্ডার করা অভিধান, একটি অভিধান যা মূলমূল্যের জোড়গুলির ক্রম রেকর্ড করে এবং আপনাকে সেই জোড়াগুলি পুনরায় অর্ডার করতে দেয়। তালিকাগুলির সাথে এটি তুলনা করুন, যা ক্রমানুসারে আদেশ করা হয়েছে ।
মার্টিজন পিটারস

36

আপনি যদি কোডটির এই অংশটি সম্পাদন করতে না পারেন যেখানে আপনার ডিকটি সংজ্ঞায়িত হয়েছিল আপনি এখনও যে কোনও বিন্দুতে আপনার পছন্দ মতো অর্ডার করতে পারেন:

from collections import OrderedDict

order_of_keys = ["key1", "key2", "key3", "key4", "key5"]
list_of_tuples = [(key, your_dict[key]) for key in order_of_keys]
your_dict = OrderedDict(list_of_tuples)

11

বেশিরভাগ সময় আমরা অর্ডারডিক্টে যাই যখন আমাদের কাস্টম অর্ডার প্রয়োজন হয় যেমন জেনেরিকের মতো নয় যেমন এএসসি ইত্যাদি not

প্রস্তাবিত সমাধানটি এখানে:

import collections
ship = {"NAME": "Albatross",
         "HP":50,
         "BLASTERS":13,
         "THRUSTERS":18,
         "PRICE":250}

ship = collections.OrderedDict(ship)

print ship


new_dict = collections.OrderedDict()
new_dict["NAME"]=ship["NAME"]
new_dict["HP"]=ship["HP"]
new_dict["BLASTERS"]=ship["BLASTERS"]
new_dict["THRUSTERS"]=ship["THRUSTERS"]
new_dict["PRICE"]=ship["PRICE"]


print new_dict

এটি আউটপুট হবে:

OrderedDict([('PRICE', 250), ('HP', 50), ('NAME', 'Albatross'), ('BLASTERS', 13), ('THRUSTERS', 18)])
OrderedDict([('NAME', 'Albatross'), ('HP', 50), ('BLASTERS', 13), ('THRUSTERS', 18), ('PRICE', 250)])

দ্রষ্টব্য : এন্ট্রি মুছে ফেলা হলে নতুন সাজানো অভিধানগুলি তাদের সাজানোর ক্রম বজায় রাখে। কিন্তু যখন নতুন কী যুক্ত করা হয়, কীগুলি শেষের সাথে যুক্ত হয় এবং বাছাই করা হয় না official ( অফিসিয়াল ডক )


2

ডিক.ইটিমস () ব্যবহার করুন; এটি নিম্নলিখিত হিসাবে সহজ হতে পারে:

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