मैं एक शब्दकोश समझ में / कैसे उपयोग कर सकता हूं?


138

क्या पायथन 2.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
जैसा कि @Marcin द्वारा बताया गया है, एक तत्वों dictसे बना है key:value, आप dictयहां निर्माण नहीं कर रहे हैं, लेकिन एक set( सेट शाब्दिक देखें )।
9

जवाबों:


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
@JeremyWeirich यदि आप नहीं चाहते हैं, तो आपको उनमें से किसी एक के लिए एक और की आवश्यकता नहीं है।
मैरिन

@Marcin क्या मेरे लिए यह संभव है कि हम केवल "अगर" का उपयोग करें और मुख्य भाग के लिए "यदि" और "दोनों" का उपयोग करें?
नथिन

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

अब मान लेते हैं कि आपके पास दो शब्दकोश हैं

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

@alancalvitti: इसे इंगित करने के लिए धन्यवाद! समाधान पायथन 2 के लिए था और पायथन 3 के लिए काम नहीं करता है; मैंने पायथन 3 समाधान भी जोड़ा।
18

3

यदि आपके पास कुंजियों और मूल्यों के मूल्यांकन के लिए अलग-अलग स्थितियां हैं, तो @ मार्सिन का उत्तर जाने का रास्ता है।

यदि आपके पास कुंजियों और मूल्यों के लिए एक ही स्थिति है , तो आप एक जनरेटर-एक्सप्रेशन फीडिंग में बिल्डिंग (कुंजी, मूल्य) -tuples के साथ बेहतर हैं 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साथ प्रत्यय चाहते हैं और आप ऐसे मामले में सेट की लंबाई के साथ प्रतिस्थापित करना चाहते हैं । अन्यथा, कुंजी-मूल्य जोड़ी अपरिवर्तित रहना चाहिए।avaluevalue

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

शब्दकोश का उपयोग करने में एक और उदाहरण / शब्दकोश में बोध

मैं अपने स्वयं के कार्यालय के काम के लिए डेटा-एंट्री डेस्कटॉप एप्लिकेशन पर काम कर रहा हूं, और इस तरह के डेटा-एंट्री एप्लिकेशन के लिए इनपुट विजेट से सभी प्रविष्टियों को प्राप्त करना और सत्यापन, या संपादन जैसी आगे की प्रक्रिया के लिए इसे एक शब्दकोश में डंप करना आम है, जिसे हमें वापस करना होगा फ़ाइल डेटा से वापस प्रवेश विगेट्स, आदि के लिए चयनित

पारंपरिक कोडिंग (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}}”

दूसरे दौर में मैंने शब्दकोश की समझ का उपयोग करने की कोशिश की लेकिन लूप अभी भी वहाँ है (6 लाइनें):

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 का उपयोग करता हूं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.