शब्दकोशों में कुंजियों का क्रम


101

कोड:

d = {'a': 0, 'b': 1, 'c': 2}
l = d.keys()

print l

यह प्रिंट करता है ['a', 'c', 'b']। मैं इस बारे में अनिश्चित हूं कि कैसे विधि l केkeys() भीतर कीवर्ड का क्रम निर्धारित करती है । हालाँकि, मैं "उचित" क्रम में खोजशब्दों को पुनः प्राप्त करने में सक्षम होना चाहता हूँ। पाठ्यक्रम का उचित क्रम सूची का निर्माण करेगा ।['a', 'b', 'c']


3
यदि पायथन डिक्शनरी सबसे अधिक पसंद करते हैं, तो वे वास्तव में हैश टेबल होते हैं। अन्य बातों के अलावा, इसका मतलब है कि चाबियों का क्रम निर्दिष्ट या निर्दिष्ट नहीं है। विशेष रूप से, यह उस क्रम को याद नहीं करेगा जिसमें कुंजियाँ जोड़ी जाती हैं।
cHao

3
@ हाहाओ: इस निबंध का अर्थ है कि यदि आप एक शब्दकोश में तत्वों पर लूप करेंगे तो आपका कार्यक्रम अनिश्चितकालीन होगा?
हैलोगूडीबाई

4
@HelloGoodbye: मैं इतनी दूर नहीं जाऊंगा; वहाँ अभी भी बहुत पूर्वानुमान योग्य व्यवहार है। प्रत्येक पूर्ण पुनरावृत्ति प्रत्येक कुंजी / मूल्य जोड़ी में से एक को देखता है। और अधिकांश भाषाओं में, आप उन्हें हर बार एक ही क्रम में देखेंगे। जब तक डॉक्स किसी विशेष ऑर्डर की गारंटी नहीं देता है, हालांकि, आपको उस ऑर्डर को गिनना नहीं चाहिए जो आप चाहते हैं। (कुछ भाषाएं (जैसे पर्ल) वास्तव में आदेश को थोड़ा यादृच्छिक कर देगी - कथित रूप से सुरक्षा कारणों से, लेकिन मुझे लगता है कि अनिर्दिष्ट व्यवहार पर भरोसा करने की आदत से आपको केवल हिला देना है। :) मुझे नहीं लगता कि पायथन काफी है। कि बुराई, लेकिन एह ...)
cHao

1
आदेश वही होगा जो प्रदान करना संशोधित नहीं किया गया है। मैनुअल से: "यदि आइटम (), कुंजियाँ (), मान (), पुनरावृत्तियाँ (), iterkeys (), और itervalues ​​() को शब्दकोश में कोई हस्तक्षेप करने वाले संशोधनों के साथ नहीं बुलाया जाता है, तो सूचियां सीधे मेल खाती हैं। इससे निर्माण की अनुमति मिलती है। zip (): जोड़े = zip (d.values ​​(), d.keys ()) का उपयोग करके (मान, कुंजी) जोड़े।
स्टेवियायर

2
@sfranky मुझे लगता है कि स्टेवियायर का मतलब यह है कि आप जो अलग-अलग तरीकों का उपयोग कर प्राप्त करते हैं, उनके बीच का क्रम समान है, न कि उस अध्यादेश के समान जिसमें तत्वों को लिखा गया था।
bli

जवाबों:


78

आप ऑर्डरडीड का उपयोग कर सकते हैं (पायथन 2.7 की आवश्यकता) या उच्चतर का ।

यह भी ध्यान दें OrderedDict({'a': 1, 'b':2, 'c':3})dict आपके द्वारा बनाए जाने के बाद से यह काम नहीं करेगा {...}। इसके बजाय, आप उपयोग करना चाहते हैंOrderedDict([('a', 1), ('b', 2), ('c', 3)])

जैसा कि प्रलेखन में उल्लेख किया गया है, पायथन 2.7 से कम संस्करणों के लिए, आप इस नुस्खा का उपयोग कर सकते हैं ।


18
ध्यान रखें, ऑर्डरडीड का क्रम सम्मिलन क्रम है; कुंजियाँ केवल वर्णमाला क्रम में बाहर आएंगी यदि आप उन्हें इस तरह से सम्मिलित करते हैं।
ह्यूग बोथवेल

यह वही है जो उन्होंने एक सरल उदाहरण के रूप में दिखाया ; इसका कोई संबंध नहीं भी हो सकता है कि वह वास्तव में इसका उपयोग करने की योजना कैसे बना रहा है। मुझे पहले ऐसे लोगों का सामना करना पड़ा है जो क्रमबद्ध क्रम में मनमाने ढंग से सम्मिलन वापस करने के लिए ऑर्डरडेड से अपेक्षा करते हैं, और इसलिए मुझे लगा कि मुझे यह इंगित करना चाहिए।
ह्यूग बोथवेल

119

अजगर 3.7+

पायथन 3.7.0 में dictवस्तुओं के सम्मिलन-क्रम संरक्षण प्रकृति को घोषित किया गया है को पायथन भाषा की कल्पना का आधिकारिक हिस्सा । इसलिए, आप इस पर निर्भर कर सकते हैं।

अजगर 3.6 (सीपीथॉन)

अजगर के 3.6 के रूप में, अजगर के CPython कार्यान्वयन के लिए, डिफॉल्ट रूप से प्रविष्टि क्रम को बनाए रखते हैं । इसे एक कार्यान्वयन विस्तार माना जाता है; collections.OrderedDictयदि आप सम्मिलन आदेश चाहते हैं, तो आपको अभी भी इसका उपयोग करना चाहिए जो कि पायथन के अन्य कार्यान्वयनों में गारंटी है।

पायथन> = 2.7 और <3.6

collections.OrderedDictजब आपको जरूरत हो तब कक्षा का उपयोग करें जो dictसम्मिलित किए गए आइटम के क्रम को याद करते हैं।


48
>>> print sorted(d.keys())
['a', 'b', 'c']

सॉर्ट किए गए फ़ंक्शन का उपयोग करें , जो इसमें पारित होने योग्य प्रकार को सॉर्ट करता है।

.keys()विधि एक मनमाना क्रम में कुंजी देता है।


12
यदि आप मूल आदेश चाहते हैं तो यह काम नहीं करता है और इसे क्रमबद्ध नहीं किया गया था।
शमौन

12

जब आप इसका उपयोग करना चाहते हैं तो सूची को क्रमबद्ध करें।

l = sorted(d.keys())

12

से http://docs.python.org/tutorial/datastructures.html :

"एक शब्दकोश वस्तु की कुंजी () विधि, शब्दकोश में उपयोग की जाने वाली सभी कुंजियों की एक सूची देती है, मनमाने ढंग से क्रम में (यदि आप इसे क्रमबद्ध करना चाहते हैं, तो इसे क्रमबद्ध () फ़ंक्शन पर लागू करें)"।


1

हालाँकि यह आदेश मायने नहीं रखता क्योंकि शब्दकोश हैशमैप है। यह उस क्रम पर निर्भर करता है, जिसमें इसे धकेला गया है:

s = 'abbc'
a = 'cbab'

def load_dict(s):
    dict_tmp = {}
    for ch in s:
        if ch in dict_tmp.keys():
            dict_tmp[ch]+=1
        else:
            dict_tmp[ch] = 1
    return dict_tmp

dict_a = load_dict(a)
dict_s = load_dict(s)
print('for string %s, the keys are %s'%(s, dict_s.keys()))
print('for string %s, the keys are %s'%(a, dict_a.keys()))

आउटपुट:
स्ट्रिंग एबीबीसी के लिए, स्ट्रिंग सीबीएबी के लिए चाबियाँ तानाशाह (['ए', 'बी', 'सी') हैं
, कुंजी तानाशाह_की (['सी', 'बी', 'ए') हैं।


1
अजगर में शब्दकोश केवल संस्करण 3.6+ से इस
देखिए
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.