2012-02-25 14 views
49

python2.7 में + की तरह कुछ बनाने के लिए किसी भी तरह से मौजूद हैं:किसी शब्दकोश समझ में/if का उपयोग कैसे करें?

{ 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} 
+2

रूप @Marcin ने कहा, एक '' dict' कुंजी से बना है: मान' तत्वों, तुम यहाँ का निर्माण नहीं कर रहे हैं एक 'dict' लेकिन एक' set' (देखें [सेट शाब्दिक] (http: // डॉक्स .python.org/dev/whatsnew/2.7.html # अन्य-भाषा-परिवर्तन))। – MatToufoutu

उत्तर

102

आप पहले से ही यह मिल गया है कुछ भी कर सकते हैं: A if test else B एक है वैध पायथन अभिव्यक्ति। दिखाया गया है आपकी dict समझ के साथ ही समस्या यह है कि एक dict समझ में एक अभिव्यक्ति के लिए जगह दो भाव, एक कॉलन से अलग कर दिया होना आवश्यक है:

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

अंतिम if खंड एक फिल्टर है, जो से अलग है के रूप में कार्य सशर्त अभिव्यक्ति है।

+5

उल्लेखनीय है कि आपको कुंजी और मूल्य दोनों के लिए एक और शर्त की आवश्यकता नहीं है। उदाहरण के लिए, '{(यदि कोई अन्य शर्त बी): कुंजी के लिए मान, dict.items()} में मान काम करेगा। –

+1

@JeremyWeirich आप उनमें से या तो के लिए एक अगर-किसी और के लिए यदि आप नहीं करना चाहते हैं की जरूरत नहीं है। – Marcin

1

@Marcin's answer यह सब को शामिल किया गया, लेकिन सिर्फ मामले में किसी को एक वास्तविक उदाहरण देखना चाहता है, मैं दो नीचे जोड़ें:

मान लीजिए कि आप सेट

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

की तरह दो शब्दकोशों है और आप अगर वहाँ संबंधित मान समान हैं, तो आप

कर सकता है d2 की चाबी से d1 में कुंजी बदलना चाहते हैं लगता है जाने
# here we assume that the values in d2 are unique 
dout2 = {d2.keys()[d2.values().index(v1)] if v1 in d2.values() else k1: v1 for k1, v1 in d1.items()} 

जो

देता है
संबंधित मुद्दे