2013-01-18 26 views
6

: koşul referans olarak değil çünküPython'da yinelenen bir listenin değerlerini değiştirin. Örneğin

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) 

Yukarıdaki kod hiçbir şey yapmaz. Bunu yapmanın doğru yolu nedir?

cevap

14

Şunları kullanabilirsiniz 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) 

Fakat, genel olarak, bu şeylerin yardımcı işlevlerini ve liste comprehensions ile küçük süpürge şunlardır:

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] 

Bu ikinci çözümün yukarı çıkmadığı unutulmamalıdır. Listeyi yerinde yediniz - Diğer bir deyişle, bu listeye başka referanslar varsa, bunlar etkilenmeyecektir. Eğer isterseniz, dilim ataması kullanarak oldukça kolay yerinde değişiklik yapabilirsiniz:

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

+1. Hem mutasyona uğramış hem de mutasyona uğramayan alternatiflerin açık bir şekilde açıklanması (genellikle bu durumlarda yaptığım gibi 3 sayfa metin yazmadan). – abarnert

+0

@abarnert - Geri bildirim için teşekkürler. Sürekli olarak iyi cevaplar yazan biri güzel bir not bıraktığında her zaman güzeldir :) – mgilson

1

Bir liste anlama kullanabilirsiniz:

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

O 'update_single_condition' bir durukyöntem ya da sadece normal bir fonksiyonu olabileceğini geliyor bana. Aksi halde, iyi cevap +1. – mgilson

İlgili konular