2017-12-18 94 views
5

अंकपाश के लिए सूची में मानों शब्दकोश अधिलेखन है

मैं एक पाश एक सूची की सामग्री पढ़ने लेकिन जब एक शब्दकोश में दो मान निर्दिष्ट करते हैं और फिर एक सूची है कि उत्पादन जोड़कर के लिए, अगले बनाया है मूल्य सूची

वांछित परिणाम

मैं जब मैं पाश के लिए एक चलाने इसलिए कई शब्दकोशों संलग्न करने के लिए एक सूची के लिए और प्रिंट 'आईपी' से संबंधित सब कुछ चाहते हैं, उसमें सब कुछ अधिलेखित कर देता है यह सब के साथ जुड़े मूल्यों प्रिंट होगा शब्दकोष मूल्य 'आईपी'।

कोड

device = { 'ip': '', 'mac': '', 'username': 'admin', 'password': [], 'device type': '', } 
listofdevices = [] 
def begin(): 
    file = open("outputfromterminal") 
    contents = file.read() 
    contents = contents.split(',')[1:] 
    for x in contents: 
    # do some text stripping 
    x = x.split(' ') 
    device['ip']=x[0] 
    device['mac']=x[1] 
    listofdevices.append(device) 

नमूना कोड

सामग्री के 1 सूचकांक है:

x[0] = '10.10.10.1' 
x[1] = 'aa:bb:cc:dd' 

सामग्री के 2 सूचकांक है:

x[0] = '20.20.20.1' 
x[1] = 'qq:ww:ee:ee:rr' 

क्या वास्तव में होता है

listofdevices[0] 'ip': 20.20.20.1, 'mac': 'qq:ww:ee:ee:rr' 
    listofdevices[1] 'ip': 20.20.20.1, 'mac': 'qq:ww:ee:ee:rr' 
+2

इसके लिए 'लूप' के साथ बहुत कुछ नहीं करना है: सूची में * समान * शब्दकोश के दो संदर्भ हैं। –

+0

तो आप कह रहे हैं कि मुझे एक नया शब्दकोश बनाने के लिए इंडेक्स नंबर का उपयोग करना होगा और मूल्यों को शब्दकोश से संबंधित इंडेक्स नंबर में जोड़ना होगा? –

+1

नहीं, इसके पास इंडेक्स का उपयोग करने के साथ कुछ भी नहीं है, आपको हर बार * नया * शब्दकोश बनाना होगा। –

उत्तर

0

आप एक नया शब्दकोश वस्तु हर बार नहीं बना रहे हैं। आप बस एक ही वस्तु को प्रत्येक पुनरावृत्ति के भीतर बदल रहे हैं। copy मॉड्यूल का उपयोग करके शब्दकोश को गहरी प्रतिलिपि बनाने का प्रयास करें। फिर इस प्रति प्राप्त करने के बाद, यह उत्परिवर्तित और सूची को संलग्न:

import copy 
device = { 'ip': '', 'mac': '', 'username': 'admin', 'password': [], 'device type': '', } 
listofdevices = [] 
def begin(): 
    file = open("outputfromterminal") 
    contents = file.read() 
    contents = contents.split(',')[1:] 
    for x in contents: 

    device = copy.deepcopy(device) #creates a deep copy of the values of previous dictionary. 
    #device now references a completely new object 

    # do some text stripping 
    x = x.split(' ') 
    device['ip']=x[0] 
    device['mac']=x[1] 
    listofdevices.append(device) 
2

इस कोड का प्रयास करें। प्रत्येक डिवाइस एक शब्दकोश की एक ही प्रति को संपादित करने की कोशिश कर रहा था।

listofdevices = [] 

def begin(): 
    with open("outputfromterminal", 'r') as f: 
     contents = f.read().split(',')[1:] 

    for line in contents: 
     # do some text stripping 
     line = line.split(' ') 

     device = { 'ip': line[0], 
        'mac': line[1], 
        'username': 'admin', 
        'password': [], 
        'device type': '', 
        } 

     listofdevices.append(device) 
+0

* एक * प्रतिलिपि नहीं हो सकता है जब * कोई * प्रतिलिपि नहीं है ... –

+1

आप किस बारे में बात कर रहे हैं? मूल कोड में एक शब्दकोश की एक प्रति है। नहीं, शब्दकोश .copy() 'डी नहीं किया गया है, लेकिन यह एक शब्दकोश की एक प्रति है। –

+0

मैं नहीं देखता कि कैसे। यह * * * शब्दकोश की एक प्रति है? –

0

समस्या सूची के संलग्न होने के कारण है। जब आप कोई आइटम जोड़ते हैं (आपके मामले में एक शब्दकोश में)। यह एक शब्दकोश नहीं बनाता है, लेकिन यह बस संदर्भ रखता है।

यदि आप हर बार लूप में शब्दकोश शुरू कर सकते हैं तो यह काम करना चाहिए, इसलिए एक नया संदर्भ बनाया गया है।

listofdevices = [] 
def begin(): 
    file = open("outputfromterminal") 
    contents = file.read() 
    contents = contents.split(',')[1:] 
    for x in contents: 
    # do some text stripping 
    x = x.split(' ') 
    device = { 'ip': '', 'mac': '', 'username': 'admin', 'password': [], 'device type': '', } 
    device['ip']=x[0] 
    device['mac']=x[1] 
    listofdevices.append(device) 
संबंधित मुद्दे