как обновить всю часть после соответствия - PullRequest
0 голосов
/ 22 мая 2018

Еще один вопрос о Обновление значения при сопоставлении в массиве

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 голосов
/ 22 мая 2018

Назначение (=) не меняет переменную на месте.

Вот 2 варианта решения этой проблемы:

  1. изменить список вместо элемента всписок:

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

обновить сам дикт.(update является методом на месте)

for item in data: if item['hostname'] == 'c.example.com': item.update(update) Это работает, только если ключи в вашей переменной update перекрываются с ключами в элементе.

0 голосов
/ 22 мая 2018

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

(*) Хотя исходные данные этим не изменяются, они могут быть «удалены», т.е.его память может быть освобождена, если на нее больше не ссылается какая-либо переменная, потому что она больше не нужна.

0 голосов
/ 22 мая 2018

Вам необходимо удалить элемент в данных и добавить 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"}, но необновление фактического 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'}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...