#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.