2015-06-11 6 views
6

मैं निम्नलिखित तीन तार है (वे स्वतंत्र रूप से मौजूद हैं, लेकिन सुविधा के लिए एक साथ यहाँ प्रदर्शित किया गया):क्या मैं हर बार एक बार फिर से रहने के लिए एक नियम के आदेश पर भरोसा कर सकता हूं?

from mx2.x.org (mx2.x.org. [198.186.238.144]) 
      by mx.google.com with ESMTPS id g34si6312040qgg.122.2015.04.22.14.49.15 
      (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); 
      Wed, 22 Apr 2015 14:49:16 -0700 (PDT) 

from HQPAMAIL08.x.org (10.64.17.33) by HQPAMAIL13.x.x.org 
(10.34.25.11) with Microsoft SMTP Server (TLS) id 14.2.347.0; Wed, 22 Apr 
2015 17:49:13 -0400 

from HQPAMAIL13.x.org ([fe80::7844:1f34:e8b2:e526]) by 
HQPAMAIL08.iadb.org ([fe80::20b5:b1cb:9c01:aa86%18]) with mapi id 
14.02.0387.000; Wed, 22 Apr 2015 17:49:12 -0400 

मैं कुछ उलट के आधार पर मूल्यों के साथ (नीचे शीर्ष पर) एक dict पॉप्युलेट करने के लिए के आदेश देख रहा हूँ तार विशेष रूप से, प्रत्येक स्ट्रिंग के लिए, मैं आईपी पते को एक प्रकार के सूचकांक के रूप में निकालने जा रहा हूं, और उसके बाद पूर्ण स्ट्रिंग मान के रूप में। फिर

IPs =[] 
fullStrings =[] 
for string in strings: 
    IPs.append[$theIpAddressFoundInTheString] 
    fullstrings.append[$theWholeString] 

निम्नलिखित दो सूचियों में जिसके परिणामस्वरूप (,:

यह देखते हुए कि क्रम महत्वपूर्ण है, मैं सूचियों के साथ जाने का फैसला किया है, और शुरू में कुछ इस तरह से किया था (स्यूडोकोड, पाठ के ऊपर समूह के साथ) सिर्फ एक उदाहरण):

IPs ['198.186.238.144', '10.64.17.33', 'fe80::7844:1f34:e8b2:e526'] 

fullstrings ['from mx2.x.org (mx2.x.org. [198.186.238.144]) 
       by mx.google.com with ESMTPS id g34si6312040qgg.122.2015.04.22.14.49.15 
       (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); 
       Wed, 22 Apr 2015 14:49:16 -0700 (PDT)', 'from HQPAMAIL08.x.org (10.64.17.33) by HQPAMAIL13.x.x.org 
    (10.34.25.11) with Microsoft SMTP Server (TLS) id 14.2.347.0; Wed, 22 Apr 
    2015 17:49:13 -0400', 'from HQPAMAIL13.x.org ([fe80::7844:1f34:e8b2:e526]) by 
    HQPAMAIL08.x.org ([fe80::20b5:b1cb:9c01:aa86%18]) with mapi id 
    14.02.0387.000; Wed, 22 Apr 2015 17:49:12 -0400'] 

यह ठीक ऊपर काम किया है एक बिंदु तक, लेकिन अब के रूप में मैं एक dict (हार्डकोडेड सूचकांक में इन सूचियों में मूल्यों के साथ पॉप्युलेट), (फिर अन्य सूचियों में मूल्यों के खिलाफ की तुलना शुरू हर पर dcoded सूचकांक) आदि, न केवल डीबगिंग दर्द बन जाता है, कोड अस्थिर हो जाता है।

मैं एक dict का उपयोग करके फिर से लिखना शुरू कर रहा हूं (एक ऐसा स्थान लौटा रहा हूं जहां आईपी पते कुंजी हैं और पूर्ण तार मूल्य हैं)।

for k,v in myDictOfIpsAndStrings: 
    anotherDict[$someHardcodedText] = k 
    anotherDict[$otherHardcodedText] = v   

यहाँ मेरी चिंता का विषय है: मुझे यकीन है कि dict, किसी भी समय इस पर दोहराया है, हमेशा जिस क्रम में dict बनाया गया था में किया जाएगा हो सकता है तो मैं जैसे कार्य करेगा? यदि नहीं, तो सूचियों पर वापस लौटने का मेरा एकमात्र विकल्प है (और थकाऊ और भंगुर लंबाई तुलना, ऐसा करने में अंतर्निहित असाइनमेंट आदि)?

मुझे पता है कि एक निर्देश है, इसकी प्रकृति, बिना छेड़छाड़ की। और मुझे sorted फ़ंक्शन का पता है, लेकिन मैं किसी भी अवरोही/आरोही क्रम आदि द्वारा उनकी चाबियाँ क्रमबद्ध नहीं करना चाहता हूं बल्कि यह आदेश (किसी भी तरह) जिस क्रम में बनाया गया था उसे बनाए रखने के बारे में है।

+1

का प्रयोग करें एक 'collections.OrderedDict' चाहते हैं! – Ryan

+0

आपका प्रश्न अस्पष्ट है। आप किस आदेश को संरक्षित करने की उम्मीद करते हैं? जिस क्रम में आपने तत्व डाले थे? या जब आप एक से अधिक बार फिर से शुरू करते हैं तो आप जिस क्रम में बदलाव नहीं करते हैं? सम्मिलित क्रम का कोई संरक्षण नहीं है, लेकिन एक बार आपके पास शब्दकोश होने के बाद, ऑर्डर तब तक स्थिर रहता है जब तक आप अधिक कुंजी (या कुंजी हटाएं) डालें। –

+0

@minitech धन्यवाद। प्रलेखन https://docs.python.org/2/library/collections.html#collections.OrderedDict में "संस्करण 2.7 में नया" पंक्ति है, लेकिन इसे विलुप्त होने के बीच में दफनाया गया है। क्या मुझे इसे पढ़ना चाहिए क्योंकि ऑर्डर्ड डिक्ट 2.7 में नया है, या केवल popitem() विधि नई है? – Pyderman

उत्तर

9

क्या मैं यह सुनिश्चित कर सकता हूं कि जब भी यह पुनरावृत्त हो जाए, तो हमेशा उस क्रम में किया जाएगा जिसमें आदेश बनाया गया था?

नहीं, dict अनियंत्रित है, और इसके आदेश को जारी रखेगा हालांकि विशेष कार्यान्वयन का निर्णय लेता है।

>>> d = {3: 'c', 2: 'b', 1: 'a'} 
>>> d 
{1: 'a', 2: 'b', 3: 'c'} 

देखें, dict ऑर्डर बदलने के तुरंत बाद देखें।

आप सुनिश्चित करने के लिए आप एक नियतात्मक, चलाया आदेश करना चाहते हैं, तो आप उपयोग कर सकते हैं एक collections.OrderedDict

>>> from collections import OrderedDict 
>>> d = OrderedDict([(3, 'c'), (2, 'b'), (1, 'a')]) 
>>> d 
OrderedDict([(3, 'c'), (2, 'b'), (1, 'a')]) 

तुम अब भी सम्मेलनों में OrderedDict उपयोग कर सकते हैं आप के लिए

>>> d[3] 
'c' 
>>> d.get(3) 
'c' 

नोट उपयोग किया जाता है कि आपको सृजन पर सभी तत्वों को सम्मिलित करने की आवश्यकता नहीं है। यदि आप चाहें तो आप उन्हें एक समय में एक सम्मिलित कर सकते हैं।

>>> d = OrderedDict() 
>>> d[3] = 'c' 
>>> d[2] = 'b' 
>>> d[1] = 'a' 
>>> d[4] = 'd' 
>>> d 
OrderedDict([(3, 'c'), (2, 'b'), (1, 'a'), (4, 'd')]) 
+0

आप 'ऑर्डर्ड डिक्ट' का उल्लेख करना चाह सकते हैं, जो कि यदि आपकी व्याख्या सही है, तो पूरी तरह से उपयोग-मामले फिट होगा। –

4

आपको किसी निर्देश के पुनरावृत्ति आदेश पर भरोसा नहीं करना चाहिए। केवल जिस तरह से आप किसी भी स्थिर और repeatable आदेश प्राप्त कर सकते हैं की तरह कुछ करने से है: यह आप एक स्थिर आदेश दे देंगे

for key in sorted(yourdict): 
    more code here 

, लेकिन शायद वह नहीं जिसका आप चाहते हैं।

आप probbaly उपयोग करने के लिए एक OrderedDict

+2

आप ** ** एक dict के पुनरावृत्ति क्रम पर भरोसा कर सकते हैं, बशर्ते आप कुछ भी डालें या हटाएं। आप किस पर भरोसा नहीं कर सकते हैं सम्मिलन आदेश संरक्षित किया जा रहा है। –

+0

@MartijnPieters ठीक है। ऊपर मेरा प्रश्न देखें। मुझे लगता है कि अगर मैं इस पहलू का लाभ उठाना चाहता हूं तो मुझे एक ही समय में निर्देश तैयार करना होगा। – Pyderman

+1

@MartijnPieters धन्यवाद - यह एक महत्वपूर्ण बात है। अब तक, मैंने सोचा था कि यह उन चीजों का पुनरावृत्ति था जो क्रम में बदलाव का कारण बनते थे। – Jesuisme

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