Неожиданный список при попытке создать список словарей в python - PullRequest
0 голосов
/ 11 марта 2020

Я пытаюсь создать список словаря. Ожидаемый результат состоит в том, что для 5 учеников в списке должно быть 5 словарных элементов с ключами Name и Marks (в списке). Вывод, который я получаю, - это повторение информации 5 раз для последнего студента в итерации. Пожалуйста, дайте мне знать, где я делаю ошибку.

import random
name_list=[]
name_list = ['A','B','C','D','E']
stud_dict=dict()
stud_dict_list = []
for name in name_list:
    mark_list = []
    for i in range(1,11):
        mark_list.append(random.randint(0,100))
    stud_dict['Name']=name
    stud_dict['Marks']=mark_list
    stud_dict_list.append(stud_dict)
print(stud_dict_list) 

output:
[{'Name': 'E', 'Marks': [91, 71, 93, 33, 52, 90, 97, 98, 41, 18]}, {'Name': 'E', 'Marks': [91, 71, 93, 33, 52, 90, 97, 98, 41, 18]}, {'Name': 'E', 'Marks': [91, 71, 93, 33, 52, 90, 97, 98, 41, 18]}, {'Name': 'E', 'Marks': [91, 71, 93, 33, 52, 90, 97, 98, 41, 18]}, {'Name': 'E', 'Marks': [91, 71, 93, 33, 52, 90, 97, 98, 41, 18]}]

Ответы [ 2 ]

0 голосов
/ 11 марта 2020

Об этом спрашивали много раз, но у меня нет времени для поиска точного дублирующего банкомата, поэтому:

Python никогда копирует вещи, если явно не запрошено. Здесь вы снова и снова добавляете один и тот же в свой список:

>>> import random
>>> name_list=[]
>>> name_list = ['A','B','C','D','E']
>>> stud_dict=dict()
>>> stud_dict_list = []
>>> for name in name_list:
...     mark_list = []
...     for i in range(1,11):
...         mark_list.append(random.randint(0,100))
...     stud_dict['Name']=name
...     stud_dict['Marks']=mark_list
...     stud_dict_list.append(stud_dict)
... 
>>> stud_dict
{'Name': 'E', 'Marks': [94, 51, 79, 82, 84, 76, 92, 96, 7, 52]}
>>> id(stud_dict)
139663685096344
>>> [id(item) for item in stud_dict_list]
[139663685096344, 139663685096344, 139663685096344, 139663685096344, 139663685096344]
>>> 

Поскольку это один и тот же диктат, каждое его обновление, конечно, будет отражаться в список. И решение состоит в том, чтобы просто каждый раз создавать новый dict:

import random
name_list = ['A','B','C','D','E']
stud_dict_list = []
for name in name_list:
    mark_list = []
    for i in range(1,11):
        mark_list.append(random.randint(0,100))
    stud_dict = {'Name': name, 'Marks': mark_list}
    stud_dict_list.append(stud_dict)

Вы также хотите прочитать это для более подробной информации о Python переменных ...

0 голосов
/ 11 марта 2020

Необходимо очищать stud_dict на каждой итерации.

Код:

for name in name_list:
    mark_list = []
    for i in range(1,11):
        mark_list.append(random.randint(0,100))
    stud_dict['Name']=name
    stud_dict['Marks']=mark_list
    stud_dict_list.append(stud_dict)
    stud_dict=dict() # Here we are making dictionary empty by re-intializing with new empty dictionary.

Выход:

>>> stud_dict_list
[{'Name': 'A', 'Marks': [18, 67, 26, 83, 15, 4, 93, 74, 9, 69]}, {'Name': 'B', 'Marks': [11, 81, 21, 53, 70, 88, 21, 11, 81, 73]}, {'Name': 'C', 'Marks': [18, 58, 45, 45, 26, 73, 15, 25, 9, 99]}, {'Name': 'D', 'Marks': [16, 85, 81, 21, 92, 77, 44, 2, 99, 80]}, {'Name': 'E', 'Marks': [96, 66, 69, 96, 5, 56, 61, 5, 19, 95]}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...