2013-01-18 2 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) 

그러나, 일반적으로, 이러한 일들이 도우미 기능과 지능형리스트와 약간의 청소기입니다

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

관련 문제