পাইথন অভিধানগুলি পাইথন ৩..7-এর জন্য কেন বিপরীত নয়?


11

৩.7 থেকে শুরু করে, সারণী ক্রম বজায় রাখার জন্য স্ট্যান্ডার্ড পাইথন অভিধানগুলি গ্যারান্টিযুক্ত। (*)

d = {'b': 1, 'a': 2}
for k in d: 
    print(k)
# Prints always 'b' before 'a'.

অন্য কথায়, ডিক কীগুলি একটি কঠোর ক্রমে রাখা হয়। নীতিগতভাবে, এটি কীগুলি বিপরীতমুখী হতে দেয়। তবে, নিম্নলিখিতগুলির কোনওটিই কাজ করে না:

# TypeError: 'dict' object is not reversible
for k in reversed(d): 
    print(k)

# TypeError: 'dict_keys' object is not reversible
for k in reversed(d.keys()): 
    print(k)

প্রশ্ন: এই আচরণের পিছনে যুক্তি কী? ডিক্টগুলি কেন বিপরীতমুখী করা হয়নি? ভবিষ্যতে এই আচরণ পরিবর্তন করার কোনও পরিকল্পনা আছে কি?

অবশ্যই কাজের ভিত্তি কাজ করে:

for k in reversed(list(d.keys())): 
    print(k)

(*) প্রকৃতপক্ষে, এই পোস্টটিতে আলোচিত হিসাবে পাইথন ৩.6 এর সাধারণ ইনস্টলেশনগুলির ক্ষেত্রে এটি ইতিমধ্যে ।


আপডেট : পাইথন দিয়ে শুরু 3.8 ডিক্টগুলি আসলে বিপরীত। গৃহীত উত্তরটি গুইডো এবং অন্যান্য মূল বিকাশকারীদের মধ্যে আলোচনাকে বোঝায় যা এই সিদ্ধান্ত নিয়েছিল। সংক্ষেপে, তারা প্রয়োগের প্রচেষ্টা এবং ব্যবহারকারীর প্রকৃত সুবিধার বিরুদ্ধে ভাষার ধারাবাহিকতা ওজন করেছে।

উত্তর:


5

ডক্স থেকে :

বিপরীত ( সিক )

একটি বিপরীত ফিরে iterator। seq অবশ্যই একটি অবজেক্ট হতে হবে যার একটি __reversed__()পদ্ধতি রয়েছে বা সিকোয়েন্স প্রোটোকলকে সমর্থন করে ( __len__()পদ্ধতি এবং __getitem__()পদ্ধতিটি 0 থেকে শুরু করে পূর্ণসংখ্যার আর্গুমেন্ট সহ)।

একটি dictবস্তু বাস্তবায়ন করে না __reversed__। এটি পরের দুটি পদ্ধতি প্রয়োগ করে। তবে, __getitem__পূর্ণসংখ্যার পরিবর্তে (0 থেকে শুরু) কীগুলি আর্গুমেন্ট হিসাবে গ্রহণ করে।

কেন, এটি ইতিমধ্যে এখানে পরামর্শ এবং আলোচনা করা হয়েছে

সম্পাদনা করুন:

এই উদ্ধৃতিগুলি পাইথন-দেব মেলিং তালিকা থেকে এসেছে (থ্রেড "ডিকের জন্য" __reversed__ পদ্ধতি "থ্রেড করা হয়েছে, 25 থেকে শুরু হয়েছে। 05. 18), আমি" ধারণাগত "যুক্তি দিয়ে শুরু করব, প্রথমটি এন্টোইন পিট্রো থেকে এসেছে:

অর্ডারডিক্ট ইতিমধ্যে বিপরীত () সমর্থন করে এটির কোনও মূল্য নেই। যুক্তি দুটি উপায়ে যেতে পারে:

  1. ডিক আজকাল অর্ডারডিক্টের অনুরূপ, সুতরাং এটিও বিপরীত () সমর্থন করা উচিত;

  2. আপনি অর্ডার দেওয়ার বিষয়ে স্পষ্টভাবে ইঙ্গিত দেওয়ার জন্য আপনি অর্ডারডিক্ট ব্যবহার করতে পারেন; ডিক কিছু যোগ করার প্রয়োজন নেই।

আমার ধারণা হ'ল নিয়মিত ডিক্টসের জন্য সুনির্দিষ্ট সন্নিবেশ ক্রমটি একেবারেই নতুন, সুতরাং ধারণাটি স্থায়ী হতে এবং ডিক্ট সম্পর্কে দৈনন্দিন চিন্তাভাবনার অংশ হয়ে উঠতে কিছুটা সময় লাগবে। একবার এটি হয়ে গেলে, সম্ভবত এটি অনিবার্য যে ব্যবহারের কেসগুলি উদ্ভূত হবে এবং সেই সময়ে __ বিপর্যস্ত__ যুক্ত হবে। বাস্তবায়নটি সহজবোধ্য মনে হয় এবং সীমাবদ্ধ অর্ডার সংগ্রহটি প্রত্যাবর্তনীয় হবে বলে আশা করা অনেকটা ধারণাগত লাফের নয়।

অনুসরণ করেছেন রেমন্ড হেট্টিংগার এর উত্তর:

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

যদি এই ব্যবহারগুলির ক্ষেত্রে উত্থাপিত হয় তবে ইতিমধ্যে__ বিপরীত_দের সমর্থন করা ভাল nice যাতে লোকেরা পুনরায় স্থান প্রয়োগের পরে পপাইটেম () কলগুলি ব্যবহার করে একটি কুৎসিত কাজের প্রয়োগ বাস্তবায়িত করতে প্রলুব্ধ না হয়।

মেলিং তালিকায় প্রকাশিত মূল উদ্বেগটি হ'ল এটি কমপক্ষে কিছু বাস্তবায়নে খুব বেশি ফোলা বা মেমরির দক্ষতা (এককভাবে সংযুক্ত থাকাগুলির পরিবর্তে দ্বিগুণ লিঙ্কযুক্ত তালিকা থাকা) হ্রাস করবে, এখানে পাইথন বাগ ট্র্যাকারের ইনানাডা নওকীর উদ্ধৃতি ( ইস্যু ৩৩৪62২) ):

"অর্ডার আছে" এর অর্থ "বিপরীতমুখী" নয়। উদাহরণস্বরূপ, একক সংযুক্ত তালিকার অর্ডার দেওয়া হয়েছে, তবে বিপরীত নয়।

যদিও সিপথন বাস্তবায়ন দক্ষ সরবরাহ করতে পারে __reverse__, যোগ করার __reverse__অর্থ সমস্ত পাইথন বাস্তবায়ন এটি সরবরাহ করবে বলে আশা করা হচ্ছে। উদাহরণস্বরূপ, কিছু পাইথন বাস্তবায়ন হ্যাশম্যাপ + একক লিঙ্কযুক্ত তালিকার সাহায্যে ডিক প্রয়োগ করতে সক্ষম হতে পারে। যদি __reverse__যোগ করা হয় তবে এটি আর সম্ভব নয়।

মেলিং তালিকায় ফিরে আসুন, এখানে দুটি শেষ বার্তা রয়েছে (উভয়ই 08.06.2018 এ পোস্ট করা হয়েছে)। প্রথমটি মাইকেল সেলিকের কাছ থেকে:

আমি কি এই কথাটি বলতে পারি যে 3ক্যমত্যটি v3.8 এ অন্তর্ভুক্তির জন্য +1?

থ্রেডের শেষ পয়েন্টটি ছিল আইএনএডিএ নওকি বিভিন্ন বাস্তবায়ন নিয়ে গবেষণা করে এবং সিদ্ধান্ত নিয়েছিলেন যে এই বৈশিষ্ট্যটি 3.8 এ অন্তর্ভুক্ত করা ঠিক আছে। আমি যেমন এটি বুঝতে পারি, মাইক্রো পাইথনের v3.7 প্রয়োগের জন্য অপেক্ষা করার জন্য আইএনএডিএ-র পরামর্শের সাথে গুইডো একমত ছিলেন। যেহেতু আইএনএডিএ মন পরিবর্তন করেছে, আমি অনুমান করছি যে এটি সব পক্ষে?

গুডো ভ্যান রসমের বার্তার সাথে সমাপ্তি:

এটা আমার কাছে ঠিক শোনাচ্ছে আমাদের তখন দুটি সংস্করণ থাকবে যেখানে এটি ছিল:

  • ৩.6 যেখানে অর্ডার সংরক্ষণের বিষয়টি সিপিথনে প্রয়োগ করা হয়েছিল তবে ভাষা অনুচ্ছেদে

  • ৩.7 যেখানে এটি ভাষা অনুচ্ছেদে যুক্ত করা হয়েছিল

অন্যান্য উত্তর এবং মন্তব্যে উল্লিখিত হিসাবে, reversed()সংস্করণ 3.8 (14.10.2018) থেকে উভয় দিকচিকিত্সা এবং ডিকমিউজ উভয়ের জন্য সমর্থিত।


5
আপনার দ্বিতীয় উক্তিটি এই থ্রেড থেকে পক্ষপাতিত্ব নির্বাচনের মতো মনে হচ্ছে। Conক্যমত্য বলে মনে হয় যে কার্যকারিতাটি 3.8 তে যুক্ত করা হবে। অজগর dictreversed
৩. 3. এর

লড়াইয়ে আমার কুকুর নেই, আমি তার প্রথম প্রতিক্রিয়াটি উদ্ধৃত করেছি। তবে আপনি ঠিক বলেছেন, পয়েন্টটি ভালভাবে নেওয়া হয়েছে - আমি উদ্ধৃতিটি সরিয়েছি।
gst

1
ধন্যবাদ। অজগর-দেবের আলোচনার থ্রেড প্রকাশ করছিল। প্রকৃতপক্ষে, বৈশিষ্ট্যটি অজগর 3.8 তে ইতিমধ্যে প্রয়োগ করা হয়েছে, যা মাত্র দু'দিন আগে (অক্টোবর 14 2019) প্রকাশিত হয়েছিল।
নরম্যানিয়াস


ডক্সের উদ্ধৃতিটি সহায়ক নয়, এটি কেবলমাত্র পরবর্তী প্রশ্নটি "তাই, ডিক্ট টাইপ কেন প্রয়োগ করে না __reversed__"? পাইথন-ডেভ লিঙ্কে দরকারী সামগ্রী রয়েছে তবে প্রাসঙ্গিক অংশগুলি সরাসরি উত্তরে পুনরুত্পাদন করা উচিত (যেহেতু এই ধরনের অফ-সাইটের লিঙ্কগুলি পচতে থাকে)।
wim

3

যেহেতু পাইথন ৩.৮ বিপরীত () ডিক্টসে ব্যবহারযোগ্য

বিবর্তিত সন্নিবেশ ক্রমে বিপরীত () ব্যবহার করে ডিক্ট এবং ডিকমিউজগুলি এখন পুনরাবৃত্ত। (বিপিও -৩৩৪62২ তে রামি লাপেয়ারের দ্বারা অবদান।)


1

অজগর জন্য আপডেট 3.8

বিবর্তিত সন্নিবেশ ক্রমে বিপরীত () ব্যবহার করে ডিক্ট এবং ডিকমিউজগুলি এখন পুনরাবৃত্তিযোগ্য are

>>> dict = {1: "1", 2: "2", 3: "3"}
>>> reversed(dict)
<dict_reversekeyiterator object at 0x7f72ca795130>

এই উত্তরটি কি এমন নতুন কিছু অবদান রাখে যা ইতিমধ্যে অন্যান্য উত্তর, মন্তব্য বা প্রশ্ন নিজেই আচ্ছাদিত নয়?
নরম্যানিয়াস

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