匹配后如何更新整个部分

时间:2018-05-22 05:39:17

标签: python json python-3.x list dictionary

关于Update a value when matched in array

的进一步问题
data=[{"hostname":"a.example.com","Id":"1"},{"hostname":"b.example.com","Id":"2"},{"hostname":"c.example.com","Id":"1"},{"hostname":"d.example.com","Id":"1"}]

update={"hostname":"c.example.com","Id":"10"}

for item in data:
    if item['hostname'] == 'c.example.com':
       item = update

print(data)

为什么输出未更新

[{'hostname': 'a.example.com', 'Id': '1'}, {'hostname': 'b.example.com', 'Id': '2'}, {'hostname': 'c.example.com', 'Id': '1'}, {'hostname': 'd.example.com', 'Id': '1'}]

为什么item['Id'] = 10有效,但item = update不起作用?

如何解决?

3 个答案:

答案 0 :(得分:2)

作业(=)不会改变变量。

以下是解决此问题的两个选项:

  1. 更改列表而不是列表中的项目:
  2. for i in range(len(data)): if data[i]['hostname'] == 'c.example.com': data[i] = update

    1. 更新dict本身。 (update是一种就地方法)
    2. for item in data: if item['hostname'] == 'c.example.com': item.update(update) 仅当update变量中的键与项目中的键重叠时,此方法才有效。

答案 1 :(得分:1)

您需要删除数据中的元素并附加update

data=[{"hostname":"a.example.com","Id":"1"},{"hostname":"b.example.com","Id":"2"},{"hostname":"c.example.com","Id":"1"},{"hostname":"d.example.com","Id":"1"}]

update={"hostname":"c.example.com","Id":"10"}

for item in data:
    if item['hostname'] == 'c.example.com':
        data.remove(item) # remove the condition satisfied element
        data.append(update) # append the update

print(data)

说明:

此处的=运算符不会更新您的data元素。因此,您可以使用removeappend删除旧版本并添加新版本。

当您使用item = update时,表示您item引用了{"hostname":"c.example.com","Id":"10"}但未更新实际的data

输出:

[{'hostname': 'a.example.com', 'Id': '1'}, {'hostname': 'b.example.com', 'Id': '2'}, {'hostname': 'd.example.com', 'Id': '1'}, {'hostname': 'c.example.com', 'Id': '10'}]

答案 2 :(得分:1)

x = something

如果你有分配给x的东西,例如x = object1,如果您编写x = object2,则不会以任何方式影响object1 *(或任何其他数据)。它只是意味着变量x现在指的是另一个对象(object2而不是object1)。

x.y = something

另一方面,x.y = something确实会影响数据(一般情况下)。它修改了x中的数据。它仍然不会修改以前在x.y *中的数据 - x.y不再引用旧数据。

x['y'] = something

这与x.y = something具有非常相似的语义。

原始示例

for item in data:
    if item['hostname'] == 'c.example.com':
       item = update

item = update之后,变量item不再引用data中的项目,它引用了另一个变量:update。如果你print(item),你会看到。

之后执行的行是for item in data,它再次更改了item引用的内容,从而有效地取消了上一行。

你真正想要的是修改data,所以你应该这样做,例如

for i in range(len(data)):
    ...
    data[i] = update

(*)虽然原始数据未被修改,但它可能被“删除”,即如果它不再被任何变量引用,它的内存可能被释放,因为它不再需要。