2009-04-15 4 views
6

एक शब्दकोश बनाने के लिए "सबसे पायथनिक" तरीका क्या है जहां मेरे पास अनुक्रम में मान हैं और प्रत्येक कुंजी इसके मूल्य का कार्य होगा? मैं वर्तमान में निम्नलिखित का उपयोग कर रहा हूं, लेकिन मुझे लगता है कि मुझे बस एक क्लीनर तरीका याद आ रहा है। नोट: values एक सूची है जो किसी भी शब्दकोश से संबंधित नहीं है।क्या इस शब्दकोश को बनाने के लिए कोई और पायथन तरीका है?

for value in values: 
    new_dict[key_from_value(value)] = value 

उत्तर

15
>>> l = [ 1, 2, 3, 4 ] 
>>> dict((v, v**2) for v in l) 
{1: 1, 2: 4, 3: 9, 4: 16} 

अजगर 3.0 में आप एक "शब्दकोष समझ" जो मूल रूप से ऊपर के लिए एक आशुलिपि है उपयोग कर सकते हैं विधि सूची समझ वाक्यविन्यास से बचाता है:

dict(zip(map(key_from_value, values), values)) 

मैं कभी भी "पायथनिक" पर अधिकार नहीं होने का दावा करूंगा, लेकिन इस तरह से एक अच्छा तरीका लगता है।

+0

क्या यह कुछ आयात ट्रिकर के माध्यम से 2.6 में है? –

+0

यह होने वाला था, लेकिन आईआईआरसी समय पर इसके आसपास कोई नहीं मिला। – Kiv

+0

आखिरी मैंने सुना, 2.7 में हथियार की समझ आ रही थी; मैं इंतजार नहीं कर सकता! –

18

कम से कम इसे कम है:

{ v : v**2 for v in l } 
+0

... और pythonic! –

0

यह:

dict((key_from_value(value), value) for value in values) 
+0

इस मामले में, जहां कुंजी प्राप्त करने के लिए पहले से ही एक फ़ंक्शन परिभाषित किया गया है, तो मैं कहूंगा कि दृष्टिकोण अच्छा है। यदि ज़िप/मानचित्र को लैम्ब्डा की भी आवश्यकता होती है, तो वह समझ के पक्ष में संतुलन को टिपता है। सामान्य रूप से, यदि मानचित्र या फ़िल्टर को लैम्ब्डा की आवश्यकता होती है, तो आप समझ के साथ बेहतर हो जाते हैं। – babbageclunk

5

Py3K:

{ key_for_value(value) : value for value in values } 
संबंधित मुद्दे