python tutorial অভিধান: ঘোষিত হিসাবে একই ক্রম কী/মান রাখা?




python tutorial (10)

আপনি একটি অভিধান সঙ্গে আপনি চান কি সত্যিই করতে পারেন না। আপনার অভিধানটি ইতিমধ্যে d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10} তৈরি হয়েছে। আমি ইতিমধ্যে তৈরি করা হয় যাতে ক্রম রাখা কোন উপায় ছিল পাওয়া যায়। আমি কি বস্তুটির পরিবর্তে একটি জসন ফাইল তৈরি করলাম:

{"ac":33,"gw":20,"ap":102,"za":321,"bs":10}

আমি ব্যবহার করতাম:

r = json.load(open('file.json'), object_pairs_hook=OrderedDict)

তারপর ব্যবহৃত:

print json.dumps(r)

যাচাই করার জন্য.

আমার একটি অভিধান আছে যা আমি একটি বিশেষ ক্রমে ঘোষণা করেছি এবং সর্বদা সেই ক্রমে এটি রাখতে চাই। কী / মানগুলি তাদের মানের ভিত্তিতে ক্রমান্বয়ে রাখা যেতে পারে না, আমি কেবল এটির ক্রম অনুসারে এটি চাই।

সুতরাং যদি আমি অভিধান আছে:

d = {'ac': 33, 'gw': 20, 'ap': 102, 'za': 321, 'bs': 10}

এটি যদি আমি এটি দেখি না বা এটির মাধ্যমে পুনরাবৃত্তি করি তবে এটি কোন উপায় নেই যে পাইথন স্পষ্ট আদেশ রাখবে যে আমি কীগুলি / মানগুলি ঘোষণা করেছি?


তাত্ত্বিক অংশ ব্যাখ্যা করার পরিবর্তে, আমি একটি সহজ উদাহরণ দেব।

>>> from collections import OrderedDict
>>> my_dictionary=OrderedDict()
>>> my_dictionary['foo']=3
>>> my_dictionary['aol']=1
>>> my_dictionary
OrderedDict([('foo', 3), ('aol', 1)])
>>> dict(my_dictionary)
{'foo': 3, 'aol': 1}

উল্লেখ্য যে এই উত্তরটি python3.7 এর পূর্বে পাইথন সংস্করণগুলিতে প্রযোজ্য। CPython 3.6 একটি বাস্তবায়ন বিস্তারিত হিসাবে অধিকাংশ পরিস্থিতিতে অধীনে সন্নিবেশ আদেশ বজায় রাখে। পরবর্তীতে পাইথন 3.7 থেকে শুরু করে, এটি ঘোষণা করা হয়েছে যে বাস্তবায়নগুলি সম্মতির জন্য সন্নিবেশ আদেশটি অবশ্যই বজায় রাখা উচিত।

পাইথন অভিধান unordered হয়। যদি আপনি একটি আদেশ অভিধান চান, collections.OrderedDict চেষ্টা করুন। collections.OrderedDict

উল্লেখ্য, পাইডন 2.7 তে স্ট্যান্ডার্ড লাইব্রেরীতে অর্ডারডিক্টটি চালু করা হয়েছিল। আপনার যদি পাইথনের একটি পুরোনো সংস্করণ থাকে, তবে আপনি ActiveStateActiveState জন্য রেসিপিগুলি খুঁজে পেতে পারেন।


আপনি অভিধানের জন্য যা আমি একই জিনিস করতে পারেন।

একটি তালিকা এবং খালি অভিধান তৈরি করুন:

dictionary_items = {}
fields = [['Name', 'Himanshu Kanojiya'], ['email id', '[email protected]']]
l = fields[0][0]
m = fields[0][1]
n = fields[1][0]
q = fields[1][1]
dictionary_items[l] = m
dictionary_items[n] = q
print dictionary_items

পাইথন 3.6 এর পর থেকে, স্ট্যান্ডার্ড dict টাইপ ডিফল্টরূপে সন্নিবেশ অর্ডার বজায় রাখে।

সংজ্ঞা

d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10}

সোর্স কোড তালিকাভুক্ত ক্রম কী সঙ্গে একটি অভিধান ফলে হবে।

স্পার হ্যাশ টেবিলের জন্য পূর্ণসংখ্যার সাথে একটি সাধারণ অ্যারে ব্যবহার করে এটি অর্জন করা হয়, যেখানে সেই পূর্ণসংখ্যাগুলি অন্য অ্যারে সূচী করে যা কী-মান জোড়া (প্লাস গণনা করা হ্যাশ) সঞ্চয় করে। যে পরের অ্যারে শুধু সন্নিবেশ আদেশ আইটেম সংরক্ষণ করা হয়, এবং সম্পূর্ণ সমন্বয় প্রকৃতপক্ষে Python 3.5 এবং পূর্বে ব্যবহৃত বাস্তবায়ন কম মেমরি ব্যবহার করে। বিস্তারিত জানার জন্য রেমন্ড হেটিংয়ের দ্বারা মূল ধারণা পোস্টটি দেখুন।

3.6 এ এটি এখনও একটি বাস্তবায়ন বিস্তারিত বলে মনে করা হয়; পাইথন 3.6 ডকুমেন্টেশন নতুন কি দেখুন:

এই নতুন বাস্তবায়নটির আদেশ-সংরক্ষণের দিকটিকে বাস্তবায়ন হিসাবে বিবেচনা করা হয় এবং এটি নির্ভর করা উচিত নয় (এটি ভবিষ্যতে পরিবর্তিত হতে পারে, তবে ভাষার বৈশিষ্ট পরিবর্তন করার আগে কয়েকটি রিলিজের জন্য ভাষাতে এই নতুন লেখার বাস্তবায়ন করা বাঞ্ছনীয়। সমস্ত বর্তমান এবং ভবিষ্যতের পাইথন বাস্তবায়নের জন্য ক্রম-সংরক্ষণকারী শব্দকৌশলকে জোরদার করার জন্য; এটি ভাষাগুলির পুরোনো সংস্করণগুলির সাথে পিছনে-সামঞ্জস্য রক্ষা করতে সহায়তা করে যেখানে র্যান্ডম পুনরাবৃত্তি ক্রম এখনও কার্যকর হয়, যেমন পাইথন 3.5)।

পাইথন 3.7 এই বাস্তবায়ন বিস্তারিতটি একটি ভাষা স্পেসিফিকেশনে উন্নীত করে, তাই এখন এটি বাধ্যতামূলক যে সমস্ত সংস্করণটি নতুন সংস্করণের সাথে সামঞ্জস্যপূর্ণ সমস্ত পাইথন বাস্তবায়নের ক্রম সংরক্ষণ করে। বিডিএফএল কর্তৃক ঘোষনা দেখুন

আপনি এখনও কিছু কিছু ক্ষেত্রে collections.OrderedDict()collections.OrderedDict() শ্রেণি ব্যবহার করতে চান, কারণ এটি স্ট্যান্ডার্ড dict প্রকারের উপরে কিছু অতিরিক্ত কার্যকারিতা সরবরাহ করে। যেমন reversible হচ্ছে (এটি দৃশ্য বস্তুগুলিতে প্রসারিত হয়), এবং move_to_end() সমর্থন করে ( move_to_end() পদ্ধতির মাধ্যমে)।


আরেকটি বিকল্প প্যান্ডাস dataframe ব্যবহার করা হয় কারণ এটি অর্ডার এবং সূচীর মতো কাঠামোর আইটেমগুলির অবস্থানের অবস্থানের নিশ্চয়তা দেয়।


সাধারনত, আপনি এমন একটি শ্রেণী তৈরি করতে পারেন যা অভিধানের মতো আচরণ করে, প্রধানত পদ্ধতিগুলি বাস্তবায়ন করা হয় __contains__ , __getitem__ , __delitem__ , __setitem__ এবং আরও কিছু। যে ক্লাসটি আপনি পছন্দ করেন এমন কোনও আচরণ থাকতে পারে, উদাহরণস্বরূপ কীগুলির উপর একটি সাজানো ইটারারেটরের গোপনীয়তা ...


OrderedDict কাজ করার জন্য কিভাবে খুঁজে বের করার চেষ্টা করার সময় আমি এই পোস্ট জুড়ে এসেছিলেন। Eclipse এর জন্য PyDev অর্ডারড ডিক্টটি খুঁজে পাওয়া যায় নি, তাই আমি তাদের অভিধানের মূল মানগুলির একটি টুপল তৈরি করার সিদ্ধান্ত নিলাম, যাতে আমি তাদের অর্ডার দিতে চাই। যখন আমার তালিকাটি আউটপুট করার প্রয়োজন হয়, তখন আমি টুপলের মানগুলির মাধ্যমে পুনরাবৃত্তি করেছিলাম এবং আমার প্রয়োজনীয় ক্রম অনুসারে আমার মানগুলি পুনরুদ্ধার করতে পুনরাবৃত্তিকৃত 'কী' অভিধানকে টুপলে অভিধানে সংযুক্ত করেছিলাম।

উদাহরণ:

test_dict = dict( val1 = "hi", val2 = "bye", val3 = "huh?", val4 = "what....")
test_tuple = ( 'val1', 'val2', 'val3', 'val4')
for key in test_tuple: print(test_dict[key])

এটি একটি tad কষ্টদায়ক, কিন্তু আমি সময় জন্য চাপা হয় এবং এটা আমি সঙ্গে এসেছিলেন যে workaround।

নোট: তালিকাগুলির তালিকাটি অন্য কেউ যে প্রস্তাব দিয়েছে সেটি আমার কাছে আসলেই অর্থহীন নয়, কারণ তালিকাগুলি আদেশ এবং সূচী করা হয় (এবং অভিধানগুলির চেয়েও ভিন্ন গঠন)।


from collections import OrderedDict
OrderedDict((word, True) for word in words)

রয়েছে

OrderedDict([('He', True), ('will', True), ('be', True), ('the', True), ('winner', True)])

মান True (বা অন্য কোন অপ্রয়োজনীয় বস্তু) হলে, আপনি এটি ব্যবহার করতে পারেন:

OrderedDict.fromkeys(words, True)

যদি আপনি একটি নির্দিষ্ট ক্রমে অভিধানটি চান তবে আপনি তালিকাগুলির একটি তালিকাও তৈরি করতে পারেন যেখানে প্রথম আইটেম কী হবে এবং দ্বিতীয় আইটেমটি মান হবে এবং এই উদাহরণের মতো দেখতে হবে

>>> list =[[1,2],[2,3]]
>>> for i in list:
...     print i[0]
...     print i[1]

1
2
2
3




dictionary