আমি মুখ্য কী জোড় জোড় dictোকাতে চাই যদি ডিক.কিজে () না থাকে তবে dict মূলত আমি এটি দিয়ে করতে পারি:
if key not in d.keys():
d[key] = value
তবে এর চেয়ে ভাল উপায় আর কি আছে? বা এই সমস্যার অজগর সমাধান কি?
আমি মুখ্য কী জোড় জোড় dictোকাতে চাই যদি ডিক.কিজে () না থাকে তবে dict মূলত আমি এটি দিয়ে করতে পারি:
if key not in d.keys():
d[key] = value
তবে এর চেয়ে ভাল উপায় আর কি আছে? বা এই সমস্যার অজগর সমাধান কি?
উত্তর:
আপনার কল করার দরকার নেই d.keys(), তাই
if key not in d:
d[key] = value
যথেষ্ট। এখানে আরও পরিষ্কার, বেশি পঠনযোগ্য পদ্ধতি নেই।
আপনি এর সাথে আবার আপডেট dict.get()করতে পারেন, যা কীটি ইতিমধ্যে উপস্থিত থাকলে বিদ্যমান মানটি ফিরিয়ে দেবে:
d[key] = d.get(key, value)
তবে আমি এর বিরুদ্ধে দৃ strongly়ভাবে সুপারিশ করছি; এটি হ'ল কোড গল্ফিং, রক্ষণাবেক্ষণ এবং পঠনযোগ্যতার প্রতিবন্ধকতা।
ব্যবহার dict.setdefault():
>>> d = {1: 'one'}
>>> d.setdefault(1, '1')
'one'
>>> d # d has not changed because the key already existed
{1: 'one'}
>>> d.setdefault(2, 'two')
'two'
>>> d
{1: 'one', 2: 'two'}
dict.setdefault()মানটি খুব অ্যাক্সেস করার চেষ্টা করার সময় কেবল সত্যই ব্যবহার করা উচিত।
setdefault()যা ঘটছে তা স্পষ্টভাবে বর্ণনা করে - এটি একটি মানও দেয় যে তা গুরুত্বপূর্ণ নয়, এবং একটি সামান্য উদ্বিগ্ন আইএমও। আপনি কেন একটি তাত্পর্য ব্যাখ্যা বা একটি লিঙ্ক প্রদান করতে পারেন কেন এটি পছন্দসই নয়?
for obj in iterable: d.setdefault(key_for_obj(obj), []).append(obj)। মানটি ফিরে আসার বিষয়ে কোন তাত্পর্যপূর্ণ কিছুই নেই , এটিই পদ্ধতির পুরো বিষয় ।
if key not in d:পরীক্ষা ব্যবহার করুন ।
setdefault()মনে হয় আপনি যা বলেছিলেন সেটির দিকে তাকাতে হবে। একটি ব্যবহারের defaultdict(list)ফলে আপনার উদাহরণের চেয়ে বেশি পঠনযোগ্য কোড আসবে ... সুতরাং সম্ভবত স্ট্যান্ডার্ড অভিধান দিয়ে কাজ করা না হলে এটির জন্য কোনও ব্যবহার নেই for সামগ্রিকভাবে, আরও if key not in dপরিষ্কার।
যেহেতু পাইথন 3.9 আপনি ব্যবহার করতে পারেন একত্রীকরণ অপারেটর | দুই অভিধান একত্রীকরণ। ডানদিকে ডিকটি অগ্রাধিকার নেয়:
d = { key: value } | d
দ্রষ্টব্য: এটি আপডেট হওয়া মানগুলির সাথে একটি নতুন অভিধান তৈরি করে।
নিম্নলিখিতগুলির সাহায্যে আপনি একাধিক মান সন্নিবেশ করতে এবং ডিফল্ট মান থাকতে পারে তবে আপনি একটি নতুন অভিধান তৈরি করছেন creating
d = {**{ key: value }, **default_values}
আমি এটি সর্বাধিক ভোট দেওয়া উত্তরের সাথে পরীক্ষা করেছি এবং এটি নিম্নোক্ত উদাহরণে দেখা যায় হিসাবে গড়ে এটি দ্রুততর হয়।
আনপ্যাক অপারেটর পদ্ধতির সাথে ডিক বোঝার সাথে লুপ ভিত্তিক পদ্ধতির সাথে তুলনা করার গতি পরীক্ষা।
d = default_vals.copy()প্রথম মামলায় যদি কোনও অনুলিপি ( ) তৈরি না করা হয় তবে একবার আমরা যখন 10**5আরও বেশি মাত্রার অর্ডারে পৌঁছায় তখন সর্বাধিক ভোট দেওয়া উত্তর দ্রুত হবে । উভয় পদ্ধতির মেমরির পদচিহ্ন একই।
{**default_values, **{ key: value }}
উপরের উত্তর অনুসারে সেটডিফল্ট () পদ্ধতিটি আমার পক্ষে কাজ করেছিল।
old_attr_name = mydict.setdefault(key, attr_name)
if attr_name != old_attr_name:
raise RuntimeError(f"Key '{key}' duplication: "
f"'{old_attr_name}' and '{attr_name}'.")
যদিও এই সমাধানটি জেনারিক নয়। এই নির্দিষ্ট ক্ষেত্রে শুধু আমাকে উপযুক্ত। সঠিক সমাধানটি keyপ্রথমটির জন্য যাচাই করা হবে (যেমন ইতিমধ্যে পরামর্শ দেওয়া হয়েছিল), তবে setdefault()আমরা অভিধানে একটি অতিরিক্ত অনুসন্ধান এড়াতে পেরেছি, এটি যদিও ছোট, তবে একটি পারফরম্যান্স লাভ।