Редактирование значений в списке словарей в Python

#python #json #list #dictionary

Вопрос:

У меня есть список словарей на python. Словарь содержит «Идентификатор последовательности», который мне нужно обновить для всех словарей, убедившись, что каждый идентификатор последовательности четный и неповторяемый. Чтобы обновить идентификаторы последовательности, я использую цикл for, но поведение не такое, как я ожидаю.

 seqId = 0
for index in range(20):
    FinalNodes[index]['sequenceId'] = seqId
    seqId  =2

print(FinalNodes[7]['sequenceId'])
 

Ожидаемый результат:- 14

Наблюдаемый результат:- 38

Вот полный код снипета

 import json
import time

with open('test.json', "r") as json_file:
    data = json.load(json_file)

numberofJobs = 10

NodesList = data['nodes']
nNodes = len(NodesList)
#Divide all node into first, main and last
MainNodes = NodesList[1:nNodes-1]
FirstNode = NodesList[0:1]
LastNode  = NodesList[nNodes-1:nNodes] 

#prepare final nodes
FinalNodes = FirstNode.copy()
for i in range(numberofJobs):
    FinalNodes.extend(MainNodes)
FinalNodes.extend(LastNode)

print(FinalNodes[7]['sequenceId'])

seqId = 0
for index in range(0,20):
    FinalNodes[index]['sequenceId'] = seqId
    seqId  =2
    print(FinalNodes[index]['sequenceId'],index)


print(FinalNodes[7]['sequenceId'])
 

Вывод внутри цикла:-

 0 0
2 1
4 2
6 3
8 4
10 5
12 6
14 7
16 8
18 9
20 10
22 11
24 12
26 13
28 14
30 15
32 16
34 17
36 18
38 19
 

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

1. Я думаю, что происходит то, что все ваши словари FinalNodes ссылаются на один и тот же объект, поэтому в основном вы обновляете один и тот же словарь снова и снова, в результате чего значение равно 38. Можете ли вы показать нам, как вы строите FinalNodes ?

2. Когда я запустил ваш код с FinalNodes[индекс] в виде списка, он дал правильный результат. Однако проблема, по-видимому, заключается в том, что в вашем поле (FieldNodes) хранится идентификатор объекта, а не его значение, поэтому все его индексы возвращают 38 (что должно быть окончательным выводом последнего поля в этом цикле).

3. распечатайте все FinalNodes : это должно рассказать вам, что происходит. Также проверьте, например FinalNodes[0] is FinalNodes[1] . (Это для общей помощи в отладке, когда происходят подобные вещи, хотя, если вы опубликуете код генерации, по результатам проверки можно будет определить, являются ли дикты одним и тем же объектом)

4. Я добавил полный фрагмент кода. Когда я печатаю все конечные коды, я вижу разные значения, но все равно не ожидаемые значения. @TYZ

Ответ №1:

Пожалуйста, сверьтесь со своим FinalNodes словарем, так как я запустил тот же код, и он отлично работает!

 FinalNodes= []
for i in range(20):
    FinalNodes.append({"sequenceId":0})
seqId = 0
for index in range(8):
    FinalNodes[index]['sequenceId'] = seqId
    seqId  =2

print(FinalNodes[7]['sequenceId']) #14
 

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

1. Если вы запустите цикл до «8», вы получите 14. Попробуйте запустить его до 20

2. Даже если вы запустите код в течение 20 итераций, в результате вы получите 14.