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)

条件は参照によるものではないため、上記のコードは何もしません。これを行う適切な方法は何ですか?

4

2 に答える 2

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]

この 2 番目の解決策では、リストが適切に更新されないことに注意してください。つまり、このリストへの他の参照がある場合、それらは影響を受けません。必要に応じて、スライス割り当てを使用して非常に簡単に置換を行うことができます。

def update_condition(self, type, params):
    self.conditions[:] = [helper(c,type,params) for c in self.conditions]
于 2013-01-18T19:51:01.813 に答える
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]
于 2013-01-18T19:45:38.100 に答える