/ / অভিধান অভিধানে যদি আমি অন্য কীভাবে ব্যবহার করতে পারি?


138

নীচের মতো কিছু তৈরি করার জন্য পাইথন ২.7++ তে কি কোনও উপায় আছে?

{ something_if_true if condition else something_if_false for key, value in dict_.items() }

আমি জানি আপনি কেবল 'যদি' দিয়ে কিছু করতে পারেন:

{ something_if_true for key, value in dict_.items() if condition}

4
@ মার্সিনের হিসাবে বলা হয়েছে, একটি উপাদান dictদ্বারা তৈরি key:value, আপনি dictএখানে একটি নির্মাণ করছেন না তবে একটি set( সেট করুন আক্ষরিক দেখুন )।
mdeous

উত্তর:


247

আপনি ইতিমধ্যে এটি পেয়েছেন: 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ধারাটি একটি ফিল্টার হিসাবে কাজ করে, যা শর্তাধীন অভিব্যক্তিটি থেকে পৃথক।


28
আপনার কী এবং মান উভয়ের জন্য যদি অন্য কোনও শর্তের দরকার নেই তবে এটি উল্লেখযোগ্য। উদাহরণস্বরূপ, {(a if condition else b): value for key, value in dict.items()}কাজ করবে।
জেরেমি ওয়েইরিচ

5
@ জেরেমিওইরিচ আপনার যদি না চান তবে তাদের উভয়ের জন্য আপনার যদি অন্য কোনও দরকার হয় না।
মার্সিন

@ মার্সিন কি মূল অংশের জন্য কেবল "যদি" ব্যবহার করতে এবং মান অংশের জন্য "যদি" এবং "অন্য" উভয়ই ব্যবহার করা সম্ভব?
নিতিন

14

@ মার্সিনের উত্তরগুলি এগুলি সবই কভার করে, তবে কেউ যদি প্রকৃত উদাহরণ দেখতে চায় তবে আমি নীচে দুটি যুক্ত করব:

ধরা যাক আপনার নীচের সেটগুলির অভিধান রয়েছে

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'
alancalvitti

@ ল্যানসালভিটি: এটি দেখানোর জন্য ধন্যবাদ! সমাধানটি পাইথন 2 এর জন্য ছিল এবং পাইথন 3 এর জন্য কাজ করে না; আমি পাইথন 3 সমাধানও যুক্ত করেছি।
ক্লিব

3

কী এবং মানগুলির মূল্যায়ন করার জন্য আপনার কাছে বিভিন্ন শর্ত রয়েছে , তবে @ মার্সিনের উত্তর হ'ল উপায়।

যদি আপনার কী এবং মানগুলির জন্য একই শর্ত থাকে তবে আপনি জেনারেটর-এক্সপ্রেশন খাওয়ানোর ক্ষেত্রে টিপলস (কী, মান) দিয়ে আরও ভাল করতে পারেন 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'}}

0

অভিধান বোধগম্যতায় / অন্যথায় ব্যবহার করার ক্ষেত্রে আরেকটি উদাহরণ

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

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

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