2012-01-21 22 views
39

मैं .keys() का उपयोग करने की कोशिश कर रहा हूं और जैसी चाबियों की सूची प्राप्त करने के बजाय हमेशा अतीत में है। हालांकि मुझे यह मिल गया।पायथन शब्दकोश .keys() त्रुटि

b = { 'video':0, 'music':23 } 
k = b.keys() 
print(k[0]) 

>>>TypeError: 'dict_keys' object does not support indexing 

print(k) 
dict_keys(['music', 'video']) 

यह सिर्फ जब तक कि मैं पागल हो रहा हूँ प्रिंट चाहिए [ 'संगीत', 'वीडियो']।

क्या चल रहा है?

+3

के बाद से कोई भी नहीं अभी तक आधिकारिक दस्तावेज जुड़ा हुआ है, मैं यह करूँगा: [** शब्दकोश दृश्य वस्तु **] (http: //docs.python। org/py3k/पुस्तकालय/stdtypes.html) # शब्दकोश-दृश्य-वस्तुओं। –

+0

कृपया ध्यान दें कि शब्दकोशों, अव्यवस्थित हैं ताकि b.keys() [0] आम तौर पर नहीं करने के लिए एक बहुत ही उपयोगी बात है। –

उत्तर

85

अजगर 3 dict.keys का व्यवहार बदल ऐसी है कि वह अब एक dict_keys वस्तु है, जो iterable लेकिन इंडेक्स करने योग्य नहीं (यह पुरानी dict.iterkeys, जो अब चला गया है की तरह है) है देता है। इसलिए जैसे

>>> b = { 'video':0, 'music':23 } 
>>> k = list(b.keys()) 
>>> k 
['music', 'video'] 

या सिर्फ

>>> list(b) 
['music', 'video'] 
+14

सिर्फ 'सूची (ख)' एक ही –

+2

@JochenRitzel करता है: अच्छा बिंदु है, यह जोड़ा गया! –

+0

मैं आपको धन्यवाद देता हूं। तो आप dict_keys के माध्यम से पुनरावृत्ति के बारे में कैसे जायेंगे? – tokageKitayama

8

आप आवंटित किया है तो k:: आप list को सुस्पष्ट रूप से कॉल के साथ वापस आ अजगर 2 परिणाम प्राप्त कर सकते हैं

k = list(b.keys()) 

अपने कोड काम करेंगे।

त्रुटि के अनुसार, dict_keys प्रकार अनुक्रमण का समर्थन नहीं करता है।

2

यह अजगर 2 और 3

के बीच तोड़ने परिवर्तन अजगर 2 में से एक है:

>>> help(dict.keys) 
keys(...) 
    D.keys() -> list of D's keys 

अजगर 3 में:

>>> help(dict.keys) 
keys(...) 
    D.keys() -> a set-like object providing a view on D's keys 

व्यवहार में यह परिवर्तन एक बहुत बनाता है अर्थात् एक ताना अर्थात् अनियंत्रित है और इसकी चाबियाँ अद्वितीय हैं - बस एक सेट की तरह।

इस परिवर्तन का मतलब है कि हर बार जब आप किसी भी प्रकार की सेट तुलना करना चाहते हैं तो आपको कुंजी की एक नई सूची बनाना नहीं है।

2 में एक ही व्यवहार और 3

हो रही अजगर 3 के लिए संक्रमण में मदद करने के लिए, पायथन 2.7 एक और dict विधि, viewkeys है।viewkeys विधि पायथन 3 के dict.keys विधि के समान है:

>>> d 
{'d': None, 'a': None, 'c': None, 'b': None} 
>>> list(d.keys()) 
['d', 'a', 'c', 'b'] 

या बस के लिए dict पारित:

>>> d 
{'a': None, 'c': None, 'b': None, 'd': None} 
>>> for k in d.viewkeys(): print k 
... 
a 
c 
b 
d 
>>> d.viewkeys() & set('abc') 
set(['a', 'c', 'b']) 

अजगर 3 में, पुराने व्यवहार के सबसे करीब अनुरूप dict.keys()list को पारित करने के लिए है list, के बाद से एक dict वैसे भी अपनी चाबियाँ पर पुनरावृति जाएगा:

>>> list(d) 
['d', 'a', 'c', 'b'] 

आप करोड़ सकता है 2 और 3 से अधिक सार व्यवहार करने के लिए एक उपयोगिता कार्यों eate:

if hasattr(dict, 'viewkeys'): # Python 2.7 
    def keys(d): 
     return d.viewkeys() 
else: # Python 3 
    def keys(d): 
     return d.keys() 

और सूची प्रपत्र प्राप्त करने के लिए list करने के लिए एक dict गुजरती हैं, और दोनों 2 और 3 में, आप एक ही उत्पादन मिल जाएगा:

>>> d 
{'b': None, 'a': None, 'c': None, 'd': None} 
>>> keys(d) 
dict_keys(['b', 'a', 'c', 'd']) 
>>> list(d) 
['b', 'a', 'c', 'd'] 
0

आप बस आप सीधे इस तरह कर सकते हैं एक शब्दकोश से चाबी की एक सूची चाहते हैं:

b = {"name": "xyz", "class":"abc", "college": "qwert"} 
key_list = list(b) 

KEY_LIST एक सूची के रूप में सभी प्रमुख नामों में शामिल होंगे, हालांकि, यह एक महत्वपूर्ण दोहराता नहीं होगा, अगर अंति एक से अधिक बार। डुप्लिकेट कुंजियों को एक के रूप में गिना जाएगा।

-1

समस्या हल हो जाता है: प्रथम: आयात यादृच्छिक

>>> b = { 'video':0, 'music':23,"picture":12 } 
>>> random.choice(tuple(b.items())) 
('music', 23) 
>>> random.choice(tuple(b.items())) 
('music', 23) 
>>> random.choice(tuple(b.items())) 
('picture', 12) 
>>> random.choice(tuple(b.items())) 
('video', 0) 
>>> 
+0

आप (, पाठ जवाब और स्पष्टीकरण में प्रवेश क्यों कुछ है कि जिस तरह से काम कर रहा है) जवाब के बारे में अधिक जानकारी के लिखना चाहिए + कोड के लिए बेहतर formating का उपयोग सीधे (अतः के लिए standarts रखने के लिए)। – Tatranskymedved

संबंधित मुद्दे