कैसे एक शब्दकोष में अनुक्रमित करें?


96

मेरे पास एक शब्दकोश नीचे है:

colors = {
    "blue" : "5",
    "red" : "6",
    "yellow" : "8",
}

मैं शब्दकोश में पहली प्रविष्टि को कैसे अनुक्रमित करूं?

colors[0]KeyErrorस्पष्ट कारणों के लिए वापस आ जाएगा ।


4
"प्रथम" का क्या अर्थ है? शब्दकोशों का कोई आदेश नहीं है।
S.Lott



1
@ S.Lott मैंने शर्त लगाई कि उसने पूछा नहीं कि क्या वह जानता है कि वे अनियंत्रित थे :)।
user7778287

जवाबों:


111

पाइथॉन संस्करणों में डिक्शनरी अनियंत्रित हैं और पाइथन 3.6 सहित। यदि आप प्रविष्टियों के क्रम की परवाह नहीं करते हैं और किसी भी तरह इंडेक्स द्वारा कुंजियों या मूल्यों का उपयोग करना चाहते हैं, तो आप उपयोग कर सकते हैं d.keys()[i]और d.values()[i]या d.items()[i]। (ध्यान दें कि ये विधियाँ पाइथन 2.x में सभी कुंजियों, मूल्यों या वस्तुओं की एक सूची बनाती हैं। इसलिए यदि आपको उनकी अधिक आवश्यकता है, तो एक बार, प्रदर्शन में सुधार करने के लिए सूची को एक चर में संग्रहीत करें।)

यदि आप प्रविष्टियों के क्रम के बारे में परवाह करते हैं, तो पायथन 2.7 से शुरू करके आप इसका उपयोग कर सकते हैं collections.OrderedDict। या जोड़े की सूची का उपयोग करें

l = [("blue", "5"), ("red", "6"), ("yellow", "8")]

यदि आपको कुंजी द्वारा पहुँच की आवश्यकता नहीं है। (वैसे आपके नंबर तार क्यों हैं?)

पायथॉन 3.7 में, सामान्य शब्दकोशों का आदेश दिया जाता है, इसलिए आपको OrderedDictअब और उपयोग करने की आवश्यकता नहीं है (लेकिन आप अभी भी कर सकते हैं - यह मूल रूप से एक ही प्रकार है)। पायथन 3.6 के CPython कार्यान्वयन में पहले से ही वह परिवर्तन शामिल था, लेकिन चूंकि यह भाषा विनिर्देश का हिस्सा नहीं है, आप पायथन 3.6 में इस पर भरोसा नहीं कर सकते।


2
पायथन 2 में, एक को हटाए बिना चाबियों का निरीक्षण करने के d.iterkeys().next()बजाय उपयोग करें d.keys()[0]। यदि शब्दकोश बहुत बड़ा है, तो यह प्रदर्शन के मामले में एक बड़ा बदलाव करेगा। मूल्यों और वस्तुओं के लिए समान है। पाइथन 2.7 में आप
तानाशाह

44
पायथन 3 में, ये कॉल एक वास्तविक सूची के बजाय एक दृश्य लौटाते हैं, इसलिए आपको उन्हें सूची में कॉल करने के लिए लपेटना चाहिए () अन्यथा आप देखेंगे: "TypeError: 'dict_values' ऑब्जेक्ट इंडेक्सिंग का समर्थन नहीं करता है"। इस SO प्रश्न को देखें: stackoverflow.com/questions/17431638/…
stifin

3
एक सुधार की सिर्फ एक नाइट: आप आइटम () को कम से कम नहीं कर सकते हैं, पायथन 3 में नहीं
जॉन स्ट्रॉन्ग

1
यह जवाब अजगर 3.6+ के लिए पुराना है, कृपया नीचे @Pasha द्वारा उत्तर देखें।
हंस

1
@hans यह उत्तर Python 3.7 के लिए पुराना है, लेकिन Python 3.6 के लिए नहीं, क्योंकि शब्दकोशों की क्रम-संरक्षण प्रकृति, उस Python संस्करण के CPython कार्यान्वयन का कार्यान्वयन विवरण है, न कि भाषा का आधिकारिक हिस्सा। मैं इस उत्तर को तदनुसार अपडेट करूंगा।
स्वेन मार्नाच

111

यदि कोई अभी भी इस प्रश्न को देख रहा है, तो वर्तमान में स्वीकृत उत्तर अब पुराना हो गया है:

चूंकि Python 3.7 * डिक्शनरी -प्रोटेक्शन हैं , इसलिए वे अब वैसा ही व्यवहार करते हैं जैसा कि कभी collections.OrderedDictकिया जाता था। दुर्भाग्यवश, अभी भी शब्दकोश के keys()/ में अनुक्रमित करने के लिए कोई समर्पित तरीका नहीं है values(), इसलिए शब्दकोश में पहली कुंजी / मूल्य प्राप्त किया जा सकता है:

first_key = list(colors)[0]
first_val = list(colors.values())[0]

या वैकल्पिक रूप से (यह सूची में कुंजियों को देखने से तत्काल बचता है):

def get_first_key(dictionary):
    for key in dictionary:
        return key
    raise IndexError

first_key = get_first_key(colors)
first_val = colors[first_key]

यदि आपको n-th कुंजी की आवश्यकता है , तो इसी तरह

def get_nth_key(dictionary, n=0):
    if n < 0:
        n += len(dictionary)
    for i, key in enumerate(dictionary.keys()):
        if i == n:
            return key
    raise IndexError("dictionary index out of range") 

(* CPython 3.6 में पहले से ही ऑर्डर किए गए डीकट्स शामिल हैं, लेकिन यह केवल एक कार्यान्वयन विवरण था। भाषा विनिर्देश में 3.7 से आगे की ओर ऑर्डर किए गए डीकट्स शामिल हैं।)


कृपया संबंधित दस्तावेज को लिंक प्रदान कर सकते हैं?
अमीर अफियानियन

3

शब्दकोश का एक तत्व संबोधित करना गधे पर बैठने और सवारी का आनंद लेने जैसा है।

अजगर के नियम के रूप में नियम क्रमहीन है

अगर वहाँ है

dic = {1: "a", 2: "aa", 3: "aaa"}

अब मान लीजिये अगर मैं पसंद करता हूँ dic[10] = "b", तो यह हमेशा इस तरह नहीं जोड़ेगा

dic = {1:"a",2:"aa",3:"aaa",10:"b"}

ऐसा हो सकता है

dic = {1: "a", 2: "aa", 3: "aaa", 10: "b"}

या

dic = {1: "a", 2: "aa", 10: "b", 3: "aaa"}

या

dic = {1: "a", 10: "b", 2: "aa", 3: "aaa"}

या ऐसा कोई संयोजन।

अंगूठे का नियम तो है DICTIONARY है अव्यवस्थित !


यह बहुत ही सरल है ... मुझे यह पसंद है!
एलेक्स लियू 33214


2

वास्तव में मुझे एक उपन्यास समाधान मिला जिसने वास्तव में मेरी मदद की, यदि आप विशेष रूप से किसी सूची या डेटा सेट में एक निश्चित मूल्य के सूचकांक से संबंधित हैं, तो आप केवल उस सूचकांक में शब्दकोश का मूल्य निर्धारित कर सकते हैं !:

बस देखो:

list = ['a', 'b', 'c']
dictionary = {}
counter = 0
for i in list:
   dictionary[i] = counter
   counter += 1

print(dictionary) # dictionary = {'a':0, 'b':1, 'c':2}

अब हैशमैप की शक्ति के माध्यम से आप निरंतर समय में अपनी प्रविष्टियों को अनुक्रमणित कर सकते हैं (उर्फ पूरी तेजी से)


1

ओह, यह एक कठिन है। आपके पास यहां क्या है, मूल रूप से, प्रत्येक आइटम के लिए दो मूल्य हैं। फिर आप उन्हें कुंजी के रूप में एक संख्या के साथ कॉल करने का प्रयास कर रहे हैं। दुर्भाग्य से, आपका एक मान पहले से ही कुंजी के रूप में सेट है!

इसे इस्तेमाल करे:

colors = {1: ["blue", "5"], 2: ["red", "6"], 3: ["yellow", "8"]}

अब आप चाबियों को संख्या द्वारा कॉल कर सकते हैं जैसे कि उन्हें सूची की तरह अनुक्रमित किया जाता है। आप सूची के भीतर उनकी स्थिति के अनुसार रंग और संख्या को भी संदर्भित कर सकते हैं।

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

colors[1][0]
// returns 'blue'

colors[3][1]
// returns '8'

बेशक, आपको प्रत्येक रंग में किस स्थान पर नज़र रखने का एक और तरीका आना होगा। हो सकता है कि आपके पास एक और शब्दकोष हो जो प्रत्येक रंग की कुंजी को संग्रहीत करता है क्योंकि यह मूल्य है।

color_key = {'blue': 1, 'red': 6, 'yllow': 8}

फिर, यदि आपको आवश्यकता है तो आप रंगों की कुंजी भी देख पाएंगे।

रंग [color_key ['blue']] [0] 'नीला' लौटाएगा

ऐसा कुछ।

और फिर, जब आप उस पर होते हैं, तो आप संख्या मान के साथ एक कुंजी को कुंजी के रूप में बना सकते हैं ताकि आप हमेशा अपने रंगों को देखने के लिए उनका उपयोग कर सकें, आपको पता है, अगर आपको ज़रूरत है।

मान = {5: [1, 'नीला'], 6: [2, 'लाल'], 8: [3, 'लाल' '}}

फिर, (रंग [color_key [मान [५] [१]]] [०]) 'नीला' लौटाएगा।

या आप सूचियों की एक सूची का उपयोग कर सकते हैं।

सौभाग्य!


0

आप dictअनियंत्रित नहीं हैं। आप .popitem()एक मनमाना आइटम प्राप्त करने के लिए उपयोग कर सकते हैं , लेकिन यह इसे हुक से हटा देगा।


next(iter(d.items()))( .iteritems()पायथन 2 में) आपको एक मनमाना आइटम देता है (मेरे परीक्षणों में भी वही, जो समझ में आता है कि पॉपिटेम का उपयोग करके इसे लागू किया जा सकता है), लेकिन आइटम को नहीं हटाएगा।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.