आदेशात्मक आदेश को परिवर्तित करना


138

मुझे collections.OrderedDictकक्षा का उपयोग करने में थोड़ी परेशानी हो रही है । मैं रास्पबेरी पर पायथन 2.7 का उपयोग कर रहा हूं, रास्पबेरी पाई के लिए डेबियन डिस्ट्रो। मैं एक पाठ-साहसिक कार्य के लिए (साइड-बाय-साइड) तुलना के लिए दो शब्दकोशों को प्रिंट करने की कोशिश कर रहा हूं। सही तुलना करने के लिए आदेश आवश्यक है। कोई फर्क नहीं पड़ता कि मैं शब्दकोशों को उनके सामान्य ढंग से प्रिंट करने की कोशिश करता हूं।

जब मैं इसे अपने आरपीआई पर करता हूं तो मुझे यहां मिलता है:

import collections

ship = {"NAME": "Albatross",
         "HP":50,
         "BLASTERS":13,
         "THRUSTERS":18,
         "PRICE":250}

ship = collections.OrderedDict(ship)

print ship
# OrderedDict([('PRICE', 250), ('HP', 50), ('NAME', 'Albatross'), ('BLASTERS', 13), ('THRUSTERS', 18)])

जाहिर है कुछ सही नहीं है क्योंकि यह फ़ंक्शन कॉल को प्रिंट कर रहा है और कुंजी और मूल्य समूहों को नेस्टेड सूची में डाल रहा है ...

यह वही है जो मुझे अपने पीसी पर समान चलाने से मिला है:

import collections

Joe = {"Age": 28, "Race": "Latino", "Job": "Nurse"}
Bob = {"Age": 25, "Race": "White", "Job": "Mechanic", "Random": "stuff"}

#Just for clarity:
Joe = collections.OrderedDict(Joe)
Bob = collections.OrderedDict(Bob)

print Joe
# OrderedDict([('Age', 28), ('Race', 'Latino'), ('Job', 'Nurse')])
print Bob
# OrderedDict([('Age', 25), ('Race', 'White'), ('Job', 'Mechanic'), ('Random', 'stuff')])

इस बार, यह क्रम में है, लेकिन इसे अन्य चीजों को सही नहीं छापना चाहिए? (इसे सूची में डालना और फ़ंक्शन कॉल दिखाना)

मैं अपनी गलती कहां कर रहा हूं? यह अजगर के पाई संस्करण के साथ करने के लिए कुछ भी नहीं होना चाहिए क्योंकि यह सिर्फ लिनक्स संस्करण है।


3
नोट: OrderedDictसम्मिलन आदेश द्वारा सॉर्ट किया गया है, अल्फ़ान्यूमेरिक कुंजी क्रम नहीं।
el.pescado

जवाबों:


214

आप पहले एक शब्दकोश बना रहे हैं , फिर उस शब्दकोश को पास कर रहे हैं OrderedDict। पायथन संस्करणों के लिए <3.6 (*) , जब तक आप ऐसा करते हैं, तब तक आदेश सही नहीं होगा। dictस्वाभाविक रूप से आदेश नहीं दिया गया है।

इसके बजाय टुपल्स के एक क्रम में पास करें:

ship = [("NAME", "Albatross"),
        ("HP", 50),
        ("BLASTERS", 13),
        ("THRUSTERS", 18),
        ("PRICE", 250)]
ship = collections.OrderedDict(ship)

आप क्या देखते हैं जब आप प्रिंट OrderedDictयह है प्रतिनिधित्व है, और यह पूरी तरह से सही है। OrderedDict([('PRICE', 250), ('HP', 50), ('NAME', 'Albatross'), ('BLASTERS', 13), ('THRUSTERS', 18)])बस आपको पता चलता है, एक प्रजनन योग्य प्रतिनिधित्व में, सामग्री क्या है OrderedDict


(*) : सीपीथॉन 3.6 कार्यान्वयन में, dictप्रकार को अधिक मेमोरी कुशल आंतरिक संरचना का उपयोग करने के लिए अद्यतन किया गया था जिसमें सम्मिलन क्रम को संरक्षित करने के सुखद दुष्प्रभाव हैं, और विस्तार से प्रश्न में दिखाए गए कोड मुद्दों के बिना काम करता है। पायथन 3.7 के रूप में, पायथन भाषा विनिर्देशन को यह सुनिश्चित करने के लिए अद्यतन किया गया है कि सभी पायथन कार्यान्वयन को इस व्यवहार का पालन करना चाहिए। देखें मेरा यह अन्य जवाब जानकारी के लिए है और यह भी कारण है कि आप अभी भी एक का उपयोग कर सकते चाहते हैं OrderedDict()कुछ मामलों के लिए।


ठीक है, तो मेरे लिए डिक्शनरीड डिक्शनरी क्रिएट करेगा? इसके अलावा, प्रतिलिपि प्रस्तुत करने योग्य प्रतिनिधित्व के बिना प्रिंट करने के लिए क्या मैं सिर्फ चर को प्रिंट कर सकता हूं अर्थात: print ship ?? धन्यवाद :)
pythonpiboy

3
प्रश्न: आपके द्वारा बताए गए तरीके से, ऑर्डरडीड एक आदेशित "सूची" बना रहा है। इस उद्देश्य को हराने के लिए नहीं है? यह सिर्फ तत्वों की एक सूची बना रहा है, कुंजियों और मूल्यों के साथ नहीं ...
pythonpiboy

9
प्रकार दोनों की तरह कार्य करता है; एक मानचित्रण जो क्रम को बनाए रखता है। ऑर्डरिंग के साथ एक बनाने के लिए, आपको इसे आइटम ऑर्डर करने की आवश्यकता है । चूंकि एक मानक तानाशाह (PyPI या पायथन 3.6+ के अलावा किसी अन्य चीज पर) ऐसा नहीं कर सकता है, इसलिए आप इसके बजाय ट्यूपर की एक सूची देते हैं। एक बार OrderedDictकिया जाता है बनाया यह है एक शब्दकोश।
मार्टिन पीटर्स

4
भ्रम की तरह लगता है कि एक आदेश देने से है "एक आदेश को लागू करने के बजाय सिर्फ एक आदेश को बनाए रखना" लागू होता है। मैंने निश्चित रूप से यह माना है कि यह निर्माण पर इनपुट को छाँटेगा - या यह कि आइटम () फ़ंक्शन सॉर्ट किए गए आइटम को तब लौटाएंगे जब वे डाले गए थे। इसके बजाय यह सिर्फ आपको जो भी आदेश प्रदान करता है वह रखता है।
whiterook6

2
@ whiterook6: यह एक क्रमबद्ध शब्दकोश नहीं है। यह एक आदेशित शब्दकोश है, एक ऐसा शब्द है जो कुंजी-मूल्य वाले जोड़े के क्रम को रिकॉर्ड करता है और आपको उन जोड़ियों को फिर से क्रम देता है। इसकी तुलना सूचियों से करें, जो क्रमबद्ध हैं
मार्टिज़न पीटर्स

36

यदि आप कोड के इस हिस्से को संपादित नहीं कर सकते हैं, जहां आपका तानाशाही परिभाषित किया गया था, तब भी आप इसे किसी भी तरह से किसी भी बिंदु पर ऑर्डर कर सकते हैं, जैसे:

from collections import OrderedDict

order_of_keys = ["key1", "key2", "key3", "key4", "key5"]
list_of_tuples = [(key, your_dict[key]) for key in order_of_keys]
your_dict = OrderedDict(list_of_tuples)

11

ज्यादातर समय हम ऑर्डरडीड के लिए जाते हैं जब हमें कस्टम ऑर्डर की आवश्यकता होती है न कि जेनेरिक की तरह एएससी आदि।

यहाँ प्रस्तावित समाधान है:

import collections
ship = {"NAME": "Albatross",
         "HP":50,
         "BLASTERS":13,
         "THRUSTERS":18,
         "PRICE":250}

ship = collections.OrderedDict(ship)

print ship


new_dict = collections.OrderedDict()
new_dict["NAME"]=ship["NAME"]
new_dict["HP"]=ship["HP"]
new_dict["BLASTERS"]=ship["BLASTERS"]
new_dict["THRUSTERS"]=ship["THRUSTERS"]
new_dict["PRICE"]=ship["PRICE"]


print new_dict

यह आउटपुट होगा:

OrderedDict([('PRICE', 250), ('HP', 50), ('NAME', 'Albatross'), ('BLASTERS', 13), ('THRUSTERS', 18)])
OrderedDict([('NAME', 'Albatross'), ('HP', 50), ('BLASTERS', 13), ('THRUSTERS', 18), ('PRICE', 250)])

नोट : नए सॉर्ट किए गए शब्दकोशों एंट्री डिलीट होने पर अपने क्रम को बनाए रखते हैं। लेकिन जब नई कुंजियाँ जोड़ी जाती हैं, तो कुंजियों को अंत तक जोड़ दिया जाता है और छंटाई नहीं की जाती है। ( आधिकारिक डॉक्टर )


2

तानाशाही का उपयोग करें (); यह निम्नलिखित के रूप में सरल हो सकता है:

ship = collections.OrderedDict(ship.items())
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.