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

2024-04-18 23:57:19 发布

您现在位置: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)

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


Tags: 代码inselfjsonforifdeftype
2条回答

你可以使用列表理解:

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]

您可以使用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)

但是,一般来说,这些东西在helper函数和列表理解方面稍微干净一点:

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]

应该注意的是,第二个解决方案并没有及时更新列表——换句话说,如果您有其他对该列表的引用,它们将不会受到影响。如果需要,可以使用slice赋值很容易地进行替换:

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

相关问题 更多 >