উত্তর:
আপনি ইতিমধ্যে এটি পেয়েছেন: A if test else B
একটি বৈধ পাইথন এক্সপ্রেশন। আপনার ডিক বোঝার সাথে দেখানো হিসাবে একমাত্র সমস্যাটি হ'ল একটি ডিক বোঝার জন্য অভিব্যক্তির জন্য স্থানটি দুটি কোলন দ্বারা পৃথক পৃথক দুটি এক্সপ্রেশন থাকতে হবে:
{ (some_key if condition else default_key):(something_if_true if condition
else something_if_false) for key, value in dict_.items() }
চূড়ান্ত if
ধারাটি একটি ফিল্টার হিসাবে কাজ করে, যা শর্তাধীন অভিব্যক্তিটি থেকে পৃথক।
{(a if condition else b): value for key, value in dict.items()}
কাজ করবে।
@ মার্সিনের উত্তরগুলি এগুলি সবই কভার করে, তবে কেউ যদি প্রকৃত উদাহরণ দেখতে চায় তবে আমি নীচে দুটি যুক্ত করব:
ধরা যাক আপনার নীচের সেটগুলির অভিধান রয়েছে
d = {'key1': {'a', 'b', 'c'}, 'key2': {'foo', 'bar'}, 'key3': {'so', 'sad'}}
এবং আপনি একটি নতুন অভিধান তৈরি করতে চান যার কীগুলি নির্দেশ করে যে স্ট্রিংগুলি 'a'
মানগুলিতে অন্তর্ভুক্ত রয়েছে কি না, আপনি ব্যবহার করতে পারেন
dout = {"a_in_values_of_{}".format(k) if 'a' in v else "a_not_in_values_of_{}".format(k): v for k, v in d.items()}
যা ফলন দেয়
{'a_in_values_of_key1': {'a', 'b', 'c'},
'a_not_in_values_of_key2': {'bar', 'foo'},
'a_not_in_values_of_key3': {'sad', 'so'}}
এখন ধরা যাক আপনার মতো দুটি অভিধান রয়েছে have
d1 = {'bad_key1': {'a', 'b', 'c'}, 'bad_key2': {'foo', 'bar'}, 'bad_key3': {'so', 'sad'}}
d2 = {'good_key1': {'foo', 'bar', 'xyz'}, 'good_key2': {'a', 'b', 'c'}}
এবং আপনি যদি d1
চাবিগুলি কীগুলির দ্বারা প্রতিস্থাপন করতে চান d2
তবে যদি संबंधित মানগুলি অভিন্ন হয় তবে আপনি তা করতে পারেন
# here we assume that the values in d2 are unique
# Python 2
dout2 = {d2.keys()[d2.values().index(v1)] if v1 in d2.values() else k1: v1 for k1, v1 in d1.items()}
# Python 3
dout2 = {list(d2.keys())[list(d2.values()).index(v1)] if v1 in d2.values() else k1: v1 for k1, v1 in d1.items()}
যা দেয়
{'bad_key2': {'bar', 'foo'},
'bad_key3': {'sad', 'so'},
'good_key2': {'a', 'b', 'c'}}
d1
, d2
আমি পেতেAttributeError: 'dict_values' object has no attribute 'index'
কী এবং মানগুলির মূল্যায়ন করার জন্য আপনার কাছে বিভিন্ন শর্ত রয়েছে , তবে @ মার্সিনের উত্তর হ'ল উপায়।
যদি আপনার কী এবং মানগুলির জন্য একই শর্ত থাকে তবে আপনি জেনারেটর-এক্সপ্রেশন খাওয়ানোর ক্ষেত্রে টিপলস (কী, মান) দিয়ে আরও ভাল করতে পারেন dict()
:
dict((modify_k(k), modify_v(v)) if condition else (k, v) for k, v in dct.items())
এটি পড়া সহজ এবং শর্তটি প্রতি কী, মান অনুযায়ী একবার মূল্যায়ন করা হয়।
@ ক্লাবের সেটগুলির অভিধানটি ধার করার সাথে উদাহরণ:
d = {'key1': {'a', 'b', 'c'}, 'key2': {'foo', 'bar'}, 'key3': {'so', 'sad'}}
মনে করুন আপনি শুধুমাত্র প্রত্যয় করতে চান keys
সঙ্গে a
তার মধ্যে value
এবং যদি আপনি চান value
যেমন একটি ক্ষেত্রে সেটের দৈর্ঘ্য দিয়ে প্রতিস্থাপিত। অন্যথায়, মূল-মান জুটিটি অপরিবর্তিত থাকা উচিত।
dict((f"{k}_a", len(v)) if "a" in v else (k, v) for k, v in d.items())
# {'key1_a': 3, 'key2': {'bar', 'foo'}, 'key3': {'sad', 'so'}}
অভিধান বোধগম্যতায় / অন্যথায় ব্যবহার করার ক্ষেত্রে আরেকটি উদাহরণ
আমি আমার নিজের অফিসের কাজের জন্য ডেটা-এন্ট্রি ডেস্কটপ অ্যাপ্লিকেশনটিতে কাজ করছি এবং এই জাতীয় ডেটা-এন্ট্রি অ্যাপ্লিকেশনটির জন্য সাধারণভাবে ইনপুট উইজেট থেকে সমস্ত প্রবেশিকা পাওয়া এবং এটি একটি বৈধকরণের মতো সত্যায়িতকরণ, বা সম্পাদনার জন্য ডিকশনারে ফেলে দেওয়া যা আমাদের অবশ্যই ফিরে আসতে হবে ফাইল থেকে প্রবেশের উইজেট ইত্যাদিতে নির্বাচিত ডেটা ইত্যাদি
Roundতিহ্যবাহী কোডিং (8 লাইন) ব্যবহার করে প্রথম রাউন্ড:
entries = {'name': 'Material Name', 'maxt': 'Max Working Temperature', 'ther': {100: 1.1, 200: 1.2}}
a_dic, b_dic = {}, {}
for field, value in entries.items():
if field == 'ther':
for k,v in value.items():
b_dic[k] = v
a_dic[field] = b_dic
else:
a_dic[field] = value
print(a_dic)
“ {'name': 'Material Name', 'maxt': 'Max Working Temperature', 'ther': {100: 1.1, 200: 1.2}}”
দ্বিতীয় দফায় আমি অভিধানের বোঝাপড়াটি ব্যবহার করার চেষ্টা করেছি তবে লুপটি এখনও সেখানে রয়েছে (lines টি লাইন):
entries = {'name': 'Material Name', 'maxt': 'Max Working Temperature', 'ther': {100: 1.1, 200: 1.2}}
for field, value in entries.items():
if field == 'ther':
b_dic = {k:v for k,v in value.items()}
a_dic[field] = b_dic
else:
a_dic[field] = value
print(a_dic)
“ {'name': 'Material Name', 'maxt': 'Max Working Temperature', 'ther': {100: 1.1, 200: 1.2}}”
শেষ পর্যন্ত, এক-লাইন অভিধান বোঝার বিবৃতি (1 লাইন) সহ:
entries = {'name': 'Material Name', 'maxt': 'Max Working Temperature', 'ther': {100: 1.1, 200: 1.2}}
a_dic = {field:{k:v for k,v in value.items()} if field == 'ther'
else value for field, value in entries.items()}
print(a_dic)
“ {'name': 'Material Name', 'maxt': 'Max Working Temperature', 'ther': {100: 1.1, 200: 1.2}}”
আমি পাইথন ব্যবহার করি 3.8.3
dict
দ্বারা তৈরিkey:value
, আপনিdict
এখানে একটি নির্মাণ করছেন না তবে একটিset
( সেট করুন আক্ষরিক দেখুন )।