2009-05-07 20 views
198

यह सूचियों एक शब्दकोश की keys() और values() तरीकों से लौटे तरह लग रहा है हमेशा एक 1 से 1 मानचित्रण (शब्दकोश संभालने 2 तरीकों बुला के बीच में कोई परिवर्तन नहीं किया गया है) कर रहे हैं।पायथन शब्दकोश: कुंजी() और मान() हमेशा एक ही क्रम हैं?

उदाहरण के लिए:

>>> d = {'one':1, 'two': 2, 'three': 3} 
>>> k, v = d.keys(), d.values() 
>>> for i in range(len(k)): 
    print d[k[i]] == v[i] 

True 
True 
True 

आप keys() बुला और values() बुला के बीच शब्दकोश में परिवर्तन नहीं करते हैं, इसके लिए लूप ऊपर ग्रहण करने के लिए हमेशा सच प्रिंट होगा गलत क्या है? मुझे यह पुष्टि करने वाला कोई दस्तावेज नहीं मिला। यदि dict परिवर्तित नहीं होता कुंजी(), मूल्यों() और अनुकूल क्रम में आइटम() वापसी सूचियों -

+0

साइड नोट: मूल्यों की एक सूची उत्पन्न करने के लिए आपको कुंजी की सूची के माध्यम से जाना होगा, वैसे भी। ;) –

+3

सभी उत्तरों स्पष्ट रूप से इंगित करते हैं कि उत्तर "हां, हमेशा एक ही आदेश" है, लेकिन यह आदेश क्या है? स्पष्ट रूप से हैश फ़ंक्शन का क्रम, लेकिन क्या यह अनुमान लगाया जा सकता है? – naught101

+1

@ naught101 हैश फ़ंक्शन का क्रम [इस पर निर्भर नहीं है] (https://docs.python.org/3/tutorial/datastructures.html#dories)। यदि ऑर्डर वांछित है [ऑर्डर्ड डिक्ट] (https://docs.python.org/3.6/library/collections.html#collections.OrderedDict) जाने का तरीका होगा। – Marc

उत्तर

225

मिले इस: keys(), values(), iteritems(), iterkeys(), और itervalues() शब्दकोश में कोई बीच संशोधनों के साथ कहा जाता है

तो items(),, सूचियों सीधे होगा अनुरूप हैं।

2.x documentation और 3.x documentation पर।

+10

मुझे संदेह है कि आपको डाउनवॉट किया गया है, nosklo, क्योंकि आपका उत्तर लिंक के अपवाद के साथ लगभग शब्द-शब्द-शब्द एपहेकर है। यदि आपने उसके बाद 1 घंटे का उत्तर दिया, तो बहुत से लोगों को यह महसूस होगा कि आपको "यह पाया" नहीं था, लेकिन आपने उसका जवाब देखा, और यह इंगित करने के बजाय कि उसका गलत लिंक था, आपने अपना खुद का पोस्ट करने का फैसला किया। उनके उत्तर में उद्धृत सूचना एपैकर सही ढंग से लिंक पर है, उसने इसे py2.x के रूप में गलत तरीके से लेबल किया है ... इस मामले में, शब्द हानिरहित टाइपो के बराबर है जब शब्द स्पष्ट रूप से पहचाना जा सकता है। आपका जवाब उस संदर्भ में अवांछित प्रतीत हो सकता है। –

+1

@ जेरेट हार्डी: ठीक है, प्रश्न डुप्लिकेट सही उत्तरों से भरे हुए हैं। यदि यह सही है तो मैंने कभी भी कोई जवाब नहीं दिया है। मैं बस उन्हें ऊपर नहीं उठाता। – nosklo

+0

@ जेरेट हार्डी: और आपने जो कहा वह आपने किया है, वह वह था जिसने सिकोरा के संपादन के बजाय एक नया जवाब पोस्ट किया था। उन्होंने एक टिप्पणी भी छोड़ी। – nosklo

66

हाँ, क्या आप वास्तव में एक मनाया गारंटी संपत्ति है। iterkeys() & सी इसी सूचियों के समान क्रम में पुनरावृत्त करता है।

6
http://docs.python.org/dev/py3k/library/stdtypes.html#dictionary-view-objects के अनुसार

, कुंजी(), मूल्यों() और आइटम() एक dict के तरीकों इसी iterators जिसका आदेश अनुरूप वापस आ जाएगी। हालांकि, मैं एक ही चीज़ के लिए अजगर 2.x के लिए आधिकारिक दस्तावेज़ीकरण का संदर्भ नहीं ढूंढ पा रहा हूं।

तो जहाँ तक मैं बता सकता हूँ, जवाब है हां, लेकिन केवल अजगर 3.0+

+0

पायथन 2 में गारंटीकृत, नीचे देखें। –

+4

उत्तर शिफ्ट, दिशानिर्देश काम नहीं करते – Casebash

40

हाँ, यह guaranteed in python 2.x है में:

चाबियाँ, मूल्यों और आइटम विचारों कोई साथ खत्म हो रहे हैं, तो दोहराया शब्दकोश में संशोधनों बीच, वस्तुओं के आदेश सीधे अनुरूप होगा।

6

क्या इसके लायक है के लिए, कुछ भारी इस्तेमाल किया उत्पादन कोड मैं लिखा है इस धारणा पर आधारित है और मैं इसे कभी नहीं के साथ एक समस्या थी। मुझे पता है कि यह सच नहीं है हालांकि :-)

यदि आप जोखिम नहीं लेना चाहते हैं तो मैं iteritems() का उपयोग कर सकता हूं यदि आप कर सकते हैं।

for key, value in myDictionary.iteritems(): 
    print key, value 
-1

मैं इन उत्तरों से संतुष्ट नहीं था क्योंकि मैं यह सुनिश्चित करना चाहता था कि निर्यातित मूल्यों में अलग-अलग डिक्ट्स का उपयोग करते समय भी वही ऑर्डर हो।

यहां आप कुंजी ऑर्डर अपफ्रंट निर्दिष्ट करते हैं, तो लौटाए गए मानों में हमेशा एक ही ऑर्डर होगा, भले ही शिक्षक बदलता है, या आप एक अलग निर्देश का उपयोग करते हैं।

keys = dict1.keys() 
ordered_keys1 = [dict1[cur_key] for cur_key in keys] 
ordered_keys2 = [dict2[cur_key] for cur_key in keys] 
0

हां। सीपीथन 3.6 से शुरू, शब्दकोश return items in the order you inserted them

दस्तावेज़ीकरण अभी तक अपडेट नहीं किया गया है, यह बताएं कि यह एक कार्यान्वयन विस्तार है। यह पहले से ही सीपीथन 3.6 में गारंटीकृत है और अन्य सभी पायथन कार्यान्वयन starting with Python 3.7 के लिए आवश्यक होगा।

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