在Python中迭代列表的同时修改列表的值?

Jor*_*ren 6 python

例如:

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)
Run Code Online (Sandbox Code Playgroud)

上面的代码什么都不做,因为条件不是通过引用.这样做的正确方法是什么?

mgi*_*son 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)
Run Code Online (Sandbox Code Playgroud)

但是,一般来说,这些东西对辅助函数和列表推导有点清晰:

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]
Run Code Online (Sandbox Code Playgroud)

应该注意的是,第二个解决方案不会更新列表 - 换句话说,如果您对此列表有其他引用,它们将不会受到影响.如果需要,可以使用切片分配轻松地进行替换:

def update_condition(self, type, params):
    self.conditions[:] = [helper(c,type,params) for c in self.conditions]
Run Code Online (Sandbox Code Playgroud)