पायथन शब्दकोश: चाबियाँ () और मूल्य () हमेशा एक ही क्रम हैं?


312

ऐसा लगता है कि सूचियों द्वारा लौटाए गए 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(), तो क्या यह गलत है कि उपरोक्त फॉर-लूप हमेशा ट्रू प्रिंट करेगा? मुझे इसकी पुष्टि करने वाला कोई दस्तावेज नहीं मिला।


1
CPython 3.7 (और ऊपर, संभवतः) आप एक शब्दकोश मिलान प्रविष्टि क्रम के पुनरावृत्ति क्रम पर भरोसा कर सकते हैं। mail.python.org/pipermail/python-dev/2017-Deuled/151283.html
BallpointBen

@ बॉलपॉइंट तब तक यह CPython 3.6 में है और ऊपर और अन्य सभी पायथन कार्यान्वयन Python 3.7 के साथ शुरू होते हैं
बोरिस

जवाबों:


353

यह मिला:

तो items(), keys(), values(), iteritems(), iterkeys(), और itervalues()शब्दकोश में कोई हस्तक्षेप संशोधनों के साथ कहा जाता है, सूची सीधे अनुरूप होगा।

पर 2.x प्रलेखन और 3.x प्रलेखन


5
जाहिरा तौर पर 3.x प्रलेखन में कथन स्पष्ट है: "वस्तुओं का क्रम सीधे मेल
खाएगा

4
यह पाठ 3.7 प्रलेखन में गायब है। मैं केवल यह मान सकता हूं क्योंकि 3.7 में " डिक्ट
EliadL

80

हां, जो आपने देखा है वह वास्तव में एक गारंटीकृत संपत्ति है - कुंजियाँ (), मान () और आइटम () वापसी सूची में क्रमबद्ध क्रम में अगर ताना नहीं बदला गया है। iterkeys () और सी भी इसी क्रम में सूचीबद्ध सूचियों के रूप में पुनरावृति।


1
हालाँकि, यदि सूची में फेरबदल किया जाता है, तो पंडों dataframeको एक विकल्प मिलता है, जहाँ आइटमों को अपडेट या डिलीट किया जा सकता है, और एक क्रमबद्ध संरचना में वस्तुओं के क्रम और सूचकांक स्थानों को तय किया जाता है।
विले

48

हाँ यह अजगर 2.x में गारंटी है :

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


7

हाँ। CPython 3.6 के साथ शुरू करके, आपके द्वारा सम्मिलित किए गए क्रम में आइटम लौटाते हैं

उस भाग को अनदेखा करें जो कहता है कि यह कार्यान्वयन विवरण है। यह व्यवहार सीपीथॉन 3.6 में गारंटीकृत है और पायथन 3.7 के साथ शुरू होने वाले अन्य सभी पायथन कार्यान्वयन के लिए आवश्यक है


6

डॉक्स के लिए अच्छा संदर्भ। यहां बताया गया है कि आप दस्तावेज़ / कार्यान्वयन की परवाह किए बिना आदेश की गारंटी कैसे दे सकते हैं:

k, v = zip(*d.iteritems())

1
Python3.x में, dict.items ()
Good Will

4

Http://docs.python.org/dev/py3k/library/stdtypes.html#dEDIA-view-objects के अनुसार , किसी कुंजी की (), मान () और आइटम () विधियाँ उसी क्रम में वापस आएंगी, जिनके आदेश अनुरूप हैं। हालाँकि, मैं एक ही चीज़ के लिए अजगर 2.x के आधिकारिक दस्तावेज का संदर्भ नहीं पा रहा हूँ।

जहां तक ​​मैं बता सकता हूं, इसका उत्तर हां है, लेकिन केवल अजगर 3.0+ में है


4

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

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

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

-2

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

यहाँ आप प्रमुख आदेश को निर्दिष्ट करते हैं, दिए गए मानों में हमेशा वही क्रम होता है, भले ही तानाशाही बदल जाए, या आप एक अलग तरह का प्रयोग करते हैं।

keys = dict1.keys()
ordered_keys1 = [dict1[cur_key] for cur_key in keys]
ordered_keys2 = [dict2[cur_key] for cur_key in keys]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.