Словари в списке: условное обновление с помощью .update()

#python #dictionary #if-statement

#python #словарь #if-оператор

Вопрос:

Я пытаюсь обновить словари в списке nodes кортежами в другом списке source с помощью условного.

Список кортежей:

 source = [('144 IV 285', 16),
 ('144 IV 1', 11),
 ('141 IV 155', 7)]
  

Список словарей:

 nodes = [{'id': '144 IV 285','date': '2018-08-15','relevancy': 10, 'outDegree': 18},
{'id': '144 IV 240','date': '2016-08-15','relevancy': 4, 'outDegree': 10}]
  

Каждый элемент в ‘nodes’ должен быть расширен новой парой ключ ( inDegree ) значение на основе списка ‘source’. Мой код:

 for item in sources:
    for item2 in nodes:
        if item2["id"] == item[0]:
            item2.update( {"inDegree": item[1]})
        else:
            item2.update( {"inDegree": 0})
  

Проблема: как я могу заполнить ключ inDegree либо значением в списке источников, либо 0, если для элемента в ‘nodes’ в списке ‘source’ нет соответствующего идентификатора?

Ответ №1:

Проблема в том, что оно повторяется source даже после совпадения и, таким образом, перезаписывает предыдущее обновление. Вы можете распаковать свой source и выполнить сравнение:

 for item2 in nodes:
    sources = list(zip(*source))
    if item2["id"] in sources[0]:
        item2.update({"inDegree": sources[1][sources[0].index(item2["id"])]})
    else:
        item2.update({"inDegree": 0})

print(nodes)
[{'id': '144 IV 285',
  'date': '2018-08-15',
  'relevancy': 10,
  'outDegree': 18,
  'inDegree': 16},
 {'id': '144 IV 240',
  'date': '2016-08-15',
  'relevancy': 4,
  'outDegree': 10,
  'inDegree': 0}]
  

Комментарии:

1. Большое спасибо, Крис — это была именно моя проблема. Ваше решение работает отлично.

Ответ №2:

Попробуйте это:

 for item in nodes:
    for item2 in source:
        if item["id"] == item2[0]:
            item.update( {"inDegree": item2[1]})
            break
        else:
            item.update( {"inDegree": 0})