代码之家  ›  专栏  ›  技术社区  ›  Bill

如何匹配后更新整个零件

  •  0
  • Bill  · 技术社区  · 7 年前

    关于 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 回复  |  直到 7 年前
        1
  •  2
  •   slallum    7 年前

    工作分配( = )不会就地更改变量。

    以下是两个解决方案:

    1. 更改列表而不是列表中的项目:

    for i in range(len(data)): if data[i]['hostname'] == 'c.example.com': data[i] = update

    1. 更新dict本身。( update 是就地方法)

    for item in data: if item['hostname'] == 'c.example.com': item.update(update) 只有当您的 更新 变量与项中的键重叠。

        2
  •  1
  •   zvone    7 年前

    x = something

    如果您有分配给X的东西,例如 x = object1 ,如果你写 x = object2 不影响 object1 *(或任何其他相关数据)。它只是意味着这个变量 x 现在指的是另一个物体( object2 而不是 对象1 )

    x.y = something

    另一方面 X.Y=某物 影响数据(一般情况下)。它修改中的数据 X . 它仍然不修改以前在 x.y *-旧数据不再被引用 X.Y .

    x['y'] = something

    它的语义与 X.Y=某物 .

    最初的例子

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

    item = update ,变量 item 不再引用来自的项 data ,它引用另一个变量: update . 如果你 print(item) 你会看到的。

    在此之后执行的行是 for item in data ,这又改变了什么 项目 引用,从而有效地取消前一行。

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

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

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

        3
  •  1
  •   kvmahesh    7 年前

    您需要删除数据中的元素并附加 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 元素。所以你可以利用 remove append 删除旧的并添加新的。

    当你使用 item = update 这意味着你要 item {"hostname":"c.example.com","Id":"10"} 但不更新实际 数据

    输出:

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