অভিধানে কীগুলির ক্রম


106

কোড:

d = {'a': 0, 'b': 1, 'c': 2}
l = d.keys()

print l

এই মুদ্রণ ['a', 'c', 'b']। আমি পদ্ধতিতে keys()কীওয়ার্ডগুলির ক্রম কীভাবে নির্ধারণ করে তা সম্পর্কে আমি নিশ্চিত নই । তবে, আমি "যথাযথ" ক্রমে কীওয়ার্ডগুলি পুনরুদ্ধার করতে সক্ষম হতে চাই। অবশ্যই যথাযথ ক্রম তালিকা তৈরি করবে ['a', 'b', 'c']


4
পাইথন অভিধানগুলি যদি বেশিরভাগের মতো হয় তবে সেগুলি আসলে হ্যাশ টেবিল। অন্যান্য জিনিসের মধ্যে, এর অর্থ কীগুলির ক্রমের নিশ্চয়তা বা এমনকি নির্দিষ্ট নেই। বিশেষত, কীগুলি যুক্ত করা হয়েছে সেটির ক্রমটি এটি মনে রাখবে না।
সিএওও

4
@ সিএইচও: এর স্পষ্টতই এর অর্থ হ'ল যদি আপনি অভিধানে থাকা উপাদানগুলির উপর লুপ করেন তবে আপনার প্রোগ্রামটি নির্বিচারবাদী হবে?
হ্যালো গুডবাই

5
@ হেলো গুডবি: আমি এতদূর যেতে পারব না; সেখানে এখনও খুব অনুমানযোগ্য আচরণ আছে। প্রতিটি পূর্ণ পুনরাবৃত্তি প্রতিটি কী / মান জুটির ঠিক একটি দেখতে পায়। এবং বেশিরভাগ ভাষায়, আপনি এগুলি প্রতিবার একই ক্রমে দেখতে পাবেন। দস্তাবেজগুলি যদি কোনও নির্দিষ্ট আদেশের গ্যারান্টি না দেয় তবে আপনি এটি যে আদেশ চান তার উপর নির্ভর করা উচিত নয়। (কিছু ভাষা (পার্লের মতো)) সুরক্ষার কারণে কিছুটা হলেও আদেশটিকে কিছুটা এলোমেলো করে দেবে, তবে আমি মনে করি এটি অনির্দিষ্ট আচরণের উপর নির্ভর করার অভ্যাস থেকে আপনাকে looseিলা করে দেওয়া সত্যিই ঠিক নয়। :) আমি মনে করি পাইথন বেশ নয় যে খারাপ, কিন্তু এহ ...)
সিএওও

4
অর্ডারটি একই রকম হবে ডেক সংশোধন করা হয়নি। ম্যানুয়াল থেকে: "যদি আইটেম (), কী (), মান (), iteritems (), iterkeys (), এবং itervalues ​​() অভিধানে কোনও হস্তক্ষেপ পরিবর্তন না করে ডাকা হয়, তালিকাগুলি সরাসরি মিলবে। এটি তৈরি করতে দেয় জিপ () ব্যবহার করে (মান, কী) জোড়া: জোড়া = জিপ (ডি.ভালিউস (), ডি.কিজ ()) ব্যবহার করুন "
স্টিভায়ার

4
@ স্প্র্যাঙ্কি আমি মনে করি স্টিভায়ার বলতে যা বোঝায় তা হ'ল অর্ডারটি আপনি উল্লিখিত বিভিন্ন পদ্ধতি ব্যবহার করে যা অর্জন করেছেন তার মধ্যে একইরকম, যে উপাদানগুলিতে লেখা হয়েছিল সেই আদেশকারের মতো নয়।
বিলি

উত্তর:


81

আপনি অর্ডারডিক্ট ব্যবহার করতে পারেন (পাইথন ২.7 প্রয়োজন) বা বেশি ।

এছাড়াও নোট করুন OrderedDict({'a': 1, 'b':2, 'c':3})যেহেতু dictআপনি তৈরি করেছেন সেহেতু কার্যকর হবে না কারণ {...}ইতিমধ্যে উপাদানগুলির ক্রমটি ভুলে গেছে। পরিবর্তে, আপনি ব্যবহার করতে চানOrderedDict([('a', 1), ('b', 2), ('c', 3)])

ডকুমেন্টেশনে যেমন উল্লেখ করা হয়েছে, পাইথন ২.7 এর চেয়ে কম সংস্করণগুলির জন্য, আপনি এই রেসিপিটি ব্যবহার করতে পারেন ।


19
মনে রাখবেন, অর্ডারডিক্টের ক্রম হ'ল সন্নিবেশ আদেশ; আপনি যদি সেভাবে pোকান তবে কীগুলি কেবল বর্ণানুক্রমিক ক্রমে বেরিয়ে আসবে।
হিউ বোথওয়েল

এটাই তিনি সহজ সরল উদাহরণ হিসাবে দেখিয়েছেন ; তিনি কীভাবে এটি ব্যবহারের পরিকল্পনা করছেন তার সাথে এর কোনও সম্পর্ক বা নাও থাকতে পারে। আমি এর আগে এমন লোকদের মুখোমুখি হয়েছি যারা অর্ডারডিক্টকে সাজানো ক্রমে স্বেচ্ছাসেবী সন্নিবেশগুলি ফিরে আসার প্রত্যাশা করেছিল এবং তাই আমি অনুভব করেছি যে আমার এটি প্রকাশ করা উচিত।
হিউ বোথনওয়েল

131

পাইথন ৩.7++

পাইথন ৩.7.০ -তে dictবস্তুর সন্নিবেশ-ক্রম সংরক্ষণের প্রকৃতি ঘোষণা করা হয়েছে পাইথন ভাষা অনুচ্ছেদের একটি সরকারী অংশ । অতএব, আপনি এটির উপর নির্ভর করতে পারেন।

পাইথন ৩.6 (সিপিথন)

পাইথন সিপিথন বাস্তবায়নের জন্য পাইথন ৩.6 হিসাবে, অভিধানগুলি ডিফল্টরূপে সন্নিবেশ ক্রম বজায় রাখে । যদিও এটি একটি বাস্তবায়ন বিশদ হিসাবে বিবেচিত হয়; collections.OrderedDictপাইথনের অন্যান্য বাস্তবায়ন জুড়ে গ্যারান্টযুক্ত সন্নিবেশ ক্রম চাইলে আপনার এখনও ব্যবহার করা উচিত ।

পাইথন> = 2.7 এবং <3.6

আপনার collections.OrderedDictযখন প্রয়োজন এমন একটি ক্লাস ব্যবহার করুন যা serted dictোকানো আইটেমগুলির ক্রম মনে রাখে।


51
>>> print sorted(d.keys())
['a', 'b', 'c']

বাছাই করা ফাংশনটি ব্যবহার করুন যা পূর্বে প্রবেশযোগ্যদের বাছাই করে

.keys()পদ্ধতি একটি অবাধ অনুক্রমে কী ফেরৎ।


12
আপনি যদি অর্ডারটি চান তবে এটি কাজ করে না এবং এটি বাছাই করা হয়নি।
সাইমন

13

Http://docs.python.org/tutorial/datastructures.html থেকে :

"অভিধানের বস্তুর কী () পদ্ধতিটি অভিধানে ব্যবহৃত সমস্ত কীগুলির একটি তালিকা নির্বিচারে ক্রম অনুসারে (যদি আপনি এটি বাছাই করতে চান তবে কেবল এটির জন্য সাজানো () ফাংশন প্রয়োগ করুন)"।


12

আপনি যখন তালিকাটি ব্যবহার করতে চান তখন কেবল তা সাজান।

l = sorted(d.keys())

1

যদিও ডিকশনারি হ্যাশম্যাপ হওয়ায় অর্ডারটি কোনও বিষয় নয়। এটি কীভাবে এতে চাপ দেওয়া হয় তার উপর নির্ভর করে:

s = 'abbc'
a = 'cbab'

def load_dict(s):
    dict_tmp = {}
    for ch in s:
        if ch in dict_tmp.keys():
            dict_tmp[ch]+=1
        else:
            dict_tmp[ch] = 1
    return dict_tmp

dict_a = load_dict(a)
dict_s = load_dict(s)
print('for string %s, the keys are %s'%(s, dict_s.keys()))
print('for string %s, the keys are %s'%(a, dict_a.keys()))

আউটপুট:
স্ট্রিং অ্যাবসি-র জন্য, কীগুলি হ'ল ড্রে_কিজ (['a', 'বি', 'সি'])
স্ট্রিং সিবিবির জন্য, কীগুলি ডিক_কিজ (['সি', 'বি', 'এ']) রয়েছে


4
পাইথন অভিধান সন্নিবেশ শুধুমাত্র আদেশ থেকে সংস্করণ 3.6+ এই পরীক্ষা
Crivella
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.