2015-10-12 9 views
21

को देखते हुए निम्नलिखित शब्दकोश:मानचित्रण शब्दकोश मूल्य सूची

dct = {'a':3, 'b':3,'c':5,'d':3} 

मैं कैसे इस तरह के रूप में एक सूची में इन मूल्यों को लागू कर सकते हैं:

lst = ['c', 'd', 'a', 'b', 'd'] 

आदेश की तरह कुछ प्राप्त करने के लिए:

lstval = [5, 3, 3, 3, 3] 
+6

क्या होता है यदि सूची में मूल्य शब्दकोश में मौजूद नहीं है? –

+1

तो आप चाहते हैं कि इन चाबियों को एक सूची में प्राप्त करें ('सूची' (dict.keys()) 'का उपयोग करें), या आपके पास पहले से ही ऐसी सूची है? और वैसे, 'dict' को एक चर नाम के रूप में उपयोग न करें। –

+1

[पाइथन शब्दकोश का संभावित डुप्लिकेट: कुंजी की सूची के लिए मानों की सूची प्राप्त करें] (http://stackoverflow.com/questions/18453566/python-dictionary-get-list-of-values-for-list-of-keys) –

उत्तर

25

map का उपयोग करना:

>>> map(dct.get, lst) 
[5, 3, 3, 3, 3] 

का उपयोग करते हुए एक list comprehension:

>>> [dct[k] for k in lst] 
[5, 3, 3, 3, 3] 
+2

वापस देना चाहिए यह मानचित्र का उपयोग करने वाले सबसे अच्छे जैसा लगता है, इसके लिए आपको लैम्ब्डा की आवश्यकता नहीं है। –

+3

'मानचित्र' एक गड़बड़ हो जाएगा जब कोई गैर-कोई भी डिफ़ॉल्ट आवश्यक नहीं है ... –

+12

यह ध्यान देने योग्य है कि पायथन 3.x में आपको वास्तविक परिणाम प्राप्त करने के लिए 'सूची (नक्शा (dct.get, lst)) टाइप करना होगा वापस, अन्यथा आपको एक इटरेटर ऑब्जेक्ट मिलेगा। – Leb

8

आप map फ़ंक्शन का उपयोग करके अपनी सूची से कुंजी पुन: सक्रिय कर सकते हैं:

lstval = list(map(dct.get, lst)) 

या यदि आप सूची समझ पसंद करते हैं:

lstval = [dct[key] for key in lst] 
13

आप इस के लिए एक सूची समझ का उपयोग कर सकते हैं:

lstval = [ dct.get(k, your_fav_default) for k in lst ] 

मैं व्यक्तिगत रूप से अधिक सूची comprehensions का उपयोग कर का प्रस्ताव निर्मित map क्योंकि ऐसा लगता है सभी पायथन प्रोग्रामर से परिचित, कस्टम डिफ़ॉल्ट मान आवश्यक होने पर पार्स करना और विस्तार करना आसान है।

+0

[क्यों 'मानचित्र' पर सूची-कंप का उपयोग करें?] (https://docs.python.org/3.0/whatsnew/3.0.html#views-and-iterators-instead-of-lists) * विशेष रूप से मुश्किल नक्शा() समारोह के दुष्प्रभावों के लिए आह्वान किया गया है; सही परिवर्तन लूप के लिए नियमित रूप से उपयोग करना है (क्योंकि एक सूची बनाना केवल अपर्याप्त होगा)। * :) –

+0

@ ओलेग: यही कारण है कि मेरे पास 'dct.get (k, your_fav_default)' जगह है। यदि मान गुम हैं तो इसे 'your_fav_default' –

3

चर नाम के रूप में एक dict का उपयोग न करें, क्योंकि यह में बनाया गया था।

>>> d = {'a':3, 'b':3,'c':5,'d':3} 
>>> lst = ['c', 'd', 'a', 'b', 'd'] 
>>> map(lambda x:d.get(x, None), lst) 
[5, 3, 3, 3, 3] 
6
lstval = [d[x] for x in lst] 

अपने शब्दकोश dict का नाम नहीं है। dict इस प्रकार का नाम है।

2

मैं एक सूची समझ का प्रयोग करेंगे:

listval = [dict.get(key, 0) for key in lst] 

.get(key, 0) हिस्सा एक डिफ़ॉल्ट मान वापस जाने के लिए (प्रयोग किया जाता है इस मामले में 0) यदि इस कुंजी के साथ कोई तत्वमें मौजूद नहीं है।

+0

@ ओलेग कोड 'lst' के तत्वों पर पुनरावृत्ति है जो शब्दकोश में कुंजी नहीं है। तो 'lst' में कुछ हो सकता है और dict में कोई संबंधित कुंजी नहीं हो सकती है (भले ही यह अधिक समझ में न आए) और हमें उस मामले को संभालने की आवश्यकता है। – TobiMarg

0

अजगर 3 के दस्तावेजीकरण में:

तो, zip(*d.items()) अपने परिणाम दे अनज़िप करने के लिए इस्तेमाल किया।

d = {'a': 1, 'b': 2, 'c': 3, 'd': 4} 

print(d.items())  # [('a', 1), ('c', 3), ('b', 2), ('d', 4)] in Python 2 
         # dict_items([('a', 1), ('c', 3), ('b', 2), ('d', 4)]) in Python 3 

print(zip(*d.items())) # [('a', 1), ('c', 3), ('b', 2), ('d', 4)] in Python 2 
         # <zip object at 0x7f1f8713ed40> in Python 3 

k, v = zip(*d.items()) 
print(k)    # ('a', 'c', 'b', 'd') 
print(v)    # (1, 3, 2, 4) 
संबंधित मुद्दे