2013-01-18 5 views
6

उदाहरण के लिए: क्योंकि हालत संदर्भ द्वारा नहीं हैपायथन में इसे चालू करते समय एक सूची के मान संशोधित करें?

def update_condition(self, type, params): 
    for condition in self.conditions: 
     condition_loaded = json.loads(condition) 
     if condition_loaded['type'] == type: 
      condition_loaded['params'] = params 
      condition = json.dumps(condition_loaded) 

ऊपर कोड कुछ नहीं करता है। ऐसा करने का सही तरीका क्या है?

उत्तर

14

आप इस्तेमाल कर सकते हैं enumerate:

def update_condition(self, type, params): 
    for i,condition in enumerate(self.conditions): 
     condition_loaded = json.loads(condition) 
     if condition_loaded['type'] == type: 
      condition_loaded['params'] = params 
      self.conditions[i] = json.dumps(condition_loaded) 

लेकिन सामान्य रूप में, इन बातों को सहायक कार्य करता है और सूची comprehensions साथ एक छोटी सी क्लीनर हैं:

def helper(condition,type,params) 
    loaded = json.loads(condition) 
    if loaded['type'] == type: 
     loaded['params'] = params 
     return json.dumps(loaded) 
    return condition 

... 

def update_condition(self, type, params): 
    self.conditions = [helper(c,type,params) for c in self.conditions] 

यह ध्यान दिया जाना चाहिए कि यह दूसरा समाधान अद्यतन नहीं है सूची में खाया - दूसरे शब्दों में, यदि आपके पास इस सूची के अन्य संदर्भ हैं, तो वे प्रभावित नहीं होंगे। यदि आप चाहते हैं, तो आप बहुत आसानी से टुकड़ा काम का उपयोग कर जगह में प्रतिस्थापन कर सकते हैं:

def update_condition(self, type, params): 
    self.conditions[:] = [helper(c,type,params) for c in self.conditions] 
+0

+1। उत्परिवर्तनीय और गैर-उत्परिवर्ती विकल्पों दोनों के बारे में अच्छी स्पष्ट व्याख्या (पाठ के 3 पृष्ठ लिखने के बिना, जैसे कि मैं आमतौर पर इन मामलों में कर रहा हूं)। – abarnert

+0

@abarnert - प्रतिक्रिया के लिए धन्यवाद। यह हमेशा अच्छा होता है जब कोई लगातार अच्छे उत्तर लिखता है तो वह एक अच्छा नोट छोड़ देता है :) – mgilson

1

आप एक सूची समझ इस्तेमाल कर सकते हैं:

def update_single_condition(self, condition, type, params): 
    condition_loaded = json.loads(condition) 
    if condition_loaded['type'] == type: 
     condition_loaded['params'] = params 
    return json.dumps(condition_loaded) 

def update_conditions(self, type, params): 
    self.conditions = [self.update_single_condition(c, type, params) for c in self.conditions] 
+0

ऐसा नहीं है कि 'update_single_condition' एक staticmethod या सिर्फ एक नियमित रूप से समारोह हो सकता है मुझे लगता है। अन्यथा, अच्छा जवाब +1। – mgilson

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