অর্ডারডটিক্টটি এর কনস্ট্রাক্টর ব্যবহার করে আরম্ভ করার সঠিক উপায় যে এটি প্রাথমিক ডেটার ক্রম ধরে রেখেছে?


124

অর্ডার করা অভিধান (ওডি) শুরু করার সঠিক উপায় কী যাতে এটি প্রাথমিক উপাত্তের ক্রম ধরে রাখে?

from collections import OrderedDict

# Obviously wrong because regular dict loses order
d = OrderedDict({'b':2, 'a':1}) 

# An OD is represented by a list of tuples, so would this work?
d = OrderedDict([('b',2), ('a', 1)])

# What about using a list comprehension, will 'd' preserve the order of 'l'
l = ['b', 'a', 'c', 'aa']
d = OrderedDict([(i,i) for i in l])

প্রশ্ন:

  • OrderedDictআরম্ভের সময় (দ্বিতীয় ও তৃতীয় উদাহরণ) উপরের সময়গুলিতে কোনও টিপলসের তালিকার ক্রম সংরক্ষণ করা হবে , বা টিপলসগুলির তালিকার তালিকাগুলির তালিকাগুলি বা তালিকার তালিকার তালিকা ইত্যাদি পাস করা হবে?

  • OrderedDictবাস্তবে অর্ডার বজায় রাখলে কীভাবে যাচাই করা যায় ? যেহেতু dictএকটির একটি অনির্দেশ্য আদেশ রয়েছে, তাই যদি আমার পরীক্ষার ভেক্টরগুলির ভাগ্যক্রমে ডিকের অনির্দেশ্য আদেশের মতো একই প্রাথমিক ক্রম থাকে? উদাহরণস্বরূপ, যদি d = OrderedDict({'b':2, 'a':1})আমি লেখার পরিবর্তে d = OrderedDict({'a':1, 'b':2}), আমি ভুলভাবে সিদ্ধান্তে পৌঁছাতে পারি যে আদেশটি সংরক্ষণ করা হয়েছে। এই ক্ষেত্রে, আমি জানতে পারি যে একটি dictবর্ণানুক্রমিকভাবে অর্ডার করা হয়েছে, তবে এটি সর্বদা সত্য হতে পারে না। কোনও ডেটা স্ট্রাকচার অর্ডার সংরক্ষণ করে কিনা তা যাচাই করার জন্য একটি কাউন্টারিক্স নমুনা ব্যবহারের একটি নির্ভরযোগ্য উপায় কী, একটি বিরতি না হওয়া পর্যন্ত বার বার পরীক্ষামূলক ভেক্টর ব্যবহার করে দেখার চেষ্টা করা?

পিএস আমি কেবল এখানে রেফারেন্সের জন্য রেখে দেব : "অর্ডারডটিক্ট কনস্ট্রাক্টর এবং আপডেট () পদ্ধতি উভয়ই কীওয়ার্ড আর্গুমেন্ট গ্রহণ করে তবে তাদের অর্ডারটি নষ্ট হয়ে যায় কারণ পাইথনের ফাংশন কল সিম্যান্টিকস পাসওয়ার্ডে কীওয়ার্ড আর্গুমেন্টকে নিয়মিতভাবে অর্ডার না করা অভিধান ব্যবহার করে"

পিপিএস: আশা করি, ভবিষ্যতে, অর্ডারডটিক্টও কাওয়ার্গের ক্রম সংরক্ষণ করবে (উদাহরণ 1): http://bugs.python.org/issue16991


10
এটি অস্পষ্টভাবে বিদ্রূপজনক যে একটি অর্ডারডিক্টকে একটি (খালি নয়) ডিকের সাহায্যে আরম্ভ করা ভুল কাজ ... তর্কাতীতভাবে এটির ফলে একটি সতর্কতা হওয়া উচিত কারণ এটি সম্ভবত ব্যবহারকারীর উদ্দেশ্যকে লঙ্ঘন করে।
smci

3
পাইথন ৩..6-এর পরে, OrderDict(b=2, a=1)এটিও একটি সঠিক উপায়। পিইপি 468 দেখুন ।
ইভানাগাইরো

উত্তর:


90

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

মনে রাখবেন যে আপনার শেষ উদাহরণে একটি তালিকা বোধগম্যতা ব্যবহার করে কোনও পরিবর্তন হয় না। সেখানে মধ্যে কোনো পার্থক্য OrderedDict([(i,i) for i in l])এবং OrderedDict([('b', 'b'), ('a', 'a'), ('c', 'c'), ('aa', 'aa')])। তালিকা বোঝার মূল্যায়ন করা হয় এবং তালিকা তৈরি করে এবং এটি পাস করা হয়; অর্ডারডিক্ট কীভাবে এটি তৈরি হয়েছিল সে সম্পর্কে কিছুই জানেন না।


74
# An OD is represented by a list of tuples, so would this work?
d = OrderedDict([('b', 2), ('a', 1)])

হ্যাঁ, এটি কার্যকর হবে। সংজ্ঞা অনুসারে, একটি তালিকা সর্বদা সেভাবে অর্ডার করা হয় যেভাবে এটি প্রতিনিধিত্ব করা হয়। এটি তালিকা-বোধগম্যের জন্যও যায়, উত্পন্ন তালিকাটি একইভাবে ডেটা সরবরাহ করা হয় (অর্থাত্ একটি তালিকা থেকে উত্সটি হ'ল এটি হতাশাব্যঞ্জক হবে, একটি setবা dictএতটা না হয়ে উত্সাহিত )।

OrderedDictআসলে কোনও অর্ডার বজায় রাখলে কীভাবে যাচাই করা যায় । যেহেতু ডিকের একটি অনির্দেশ্য আদেশ থাকে, তবে যদি আমার পরীক্ষার ভেক্টরগুলির ভাগ্যক্রমে কোনও ডিকের অনির্দেশ্য আদেশের মতো একই প্রাথমিক আদেশ থাকে? উদাহরণস্বরূপ, যদি d = OrderedDict({'b':2, 'a':1})আমি লেখার পরিবর্তে d = OrderedDict({'a':1, 'b':2}), আমি ভুলভাবে সিদ্ধান্তে পৌঁছাতে পারি যে আদেশটি সংরক্ষণ করা হয়েছে। এই ক্ষেত্রে, আমি জানতে পেরেছি যে একটি dictবর্ণানুক্রমিকভাবে আদেশ হয় তবে এটি সর্বদা সত্য হতে পারে না। উদাহরণস্বরূপ, কোনও ডেটা স্ট্রাকচার অর্ডার সংরক্ষণ করে কিনা এবং পরীক্ষার ভেক্টরগুলিকে একবারে বিরতি না দেওয়া পর্যন্ত বার বার চেষ্টা করার অভাব না তা যাচাই করার জন্য একটি পাল্টা উদাহরণ ব্যবহার করার একটি নির্ভরযোগ্য উপায় কী।

আপনি রেফারেন্সের জন্য আপনার উত্সের তালিকাটিকে চারপাশে রাখুন এবং ইউনিট পরীক্ষা করার সময় এটি আপনার পরীক্ষার ক্ষেত্রে আপনার টেস্ট ডেটা হিসাবে ব্যবহার করুন। তাদের মাধ্যমে Iterate এবং আদেশ বজায় আছে তা নিশ্চিত করুন।


অর্ডার যাচাই করার বিষয়ে: আমি কীভাবে নিশ্চিত করব যে আমার 2-টিপল ডিকের ক্রমটি যদি অনির্দেশ্য হয় তবে তা ভঙ্গ করবে? এটি কোনও ডেটা কাঠামো সম্পর্কে একটি জেনেরিক প্রশ্ন, সম্ভবত আমার এই প্রশ্নটি থেকে এটি বিভক্ত করা উচিত।
ক্লিক করুন

1
আপনি নির্বিচারে এমন কোনও কিছু ভাঙ্গতে পারবেন না যা প্রকৃতিতে অ-সংজ্ঞাবহ is
মেটাটোস্টার

1
সুতরাং এই জাতীয় জিনিস পরীক্ষা করার সঠিক পন্থা কি? আপনি কেবল অনির্দিষ্ট চেষ্টা চালিয়ে যাচ্ছেন? প্রোগ্রামারদের জন্য অর্ডারটি অনাকাঙ্ক্ষিত, তবে এটি হ্যাশ ম্যাপ হওয়ায় এটি 'কিছু' অ্যালগরিদম অনুসরণ করে এবং একটি সঠিক পরীক্ষার সাথে লড়াই করার চেষ্টা করা উচিত?
ক্লিক করুন

2
দেখুন __hash__। বিশেষত strটাইপ সম্পর্কে ।
মেটাটোস্টার

সংজ্ঞা অনুসারে, একটি তালিকা সর্বদা সেভাবে অর্ডার করা হয় যেভাবে এটি প্রতিনিধিত্ব করা হয়। এটি আমার কাছে একটি মূল বক্তব্য ছিল। আমি আমার বেসিকের জন্য কেবল 2-টি-টিপলগুলির একটি তালিকা ব্যবহার করার সিদ্ধান্ত নিয়েছি OrderedDictযাতে আমার কাছে একটি তালিকা রূপান্তর করার ওভারহেড না থাকে OrderedDict। আমি কেবল অভিধানের পরিবর্তে তালিকার মতো উপাদানগুলির মধ্য দিয়ে লুপ করি।
ববোর্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.