deepblack
@deepblack

Не могу понять, почему list.append не работает так как ожидается?

Доброго времени суток!
По мотивам вопроса
попробовал решить, но столкнулся с трудностью при работе с list.append
python 3.4

students_data = [
    {'Name': 'Vasya', 'marks': [4, 5, 4, 5, 5]},
    {'Name': 'Petya', 'marks': [3, 5, 3, 4, 2, 2]},
    {'Name': 'Ivan', 'marks': [4, 5, 4, 4, 4, 4]},
    {'Name': 'Dima', 'marks': [4, 5, 4, 3, 3, 3]},
]

average_data = []
student_struct = {}
summ = 0

for student in students_data:
    all_marks = student['marks']
    individual_name = student['Name']

    for individual_mark in all_marks:
        summ += individual_mark

    student_struct['name'] = individual_name
    student_struct['average'] = summ
    average_data.append(student_struct)

    print('  ')
    print(student_struct)
    print(average_data)

    print(individual_name, end=' ')
    print(summ)

print(average_data)


эти строки добавил чтобы понять как работает код:
print('  ')
    print(student_struct)
    print(average_data)

    print(individual_name, end=' ')
    print(summ)


Я ожидаю, что в цикле к списку average_data будет добавлено содержимое student_struct.
Которое в свою очередь содержит Имя и суммарное количество баллов.

т.е. нечто вида:

[{'average': 23, 'name': 'Vasya'}, {'average': 42, 'name': 'Petya'}, {'average': 67, 'name': 'Ivan'}, {'average': 89, 'name': 'Dima'}]


Но получаю вот это:

{'average': 23, 'name': 'Vasya'}
[{'average': 23, 'name': 'Vasya'}]
Vasya 23

{'average': 42, 'name': 'Petya'}
[{'average': 42, 'name': 'Petya'}, {'average': 42, 'name': 'Petya'}]
Petya 42

{'average': 67, 'name': 'Ivan'}
[{'average': 67, 'name': 'Ivan'}, {'average': 67, 'name': 'Ivan'}, {'average': 67, 'name': 'Ivan'}]
Ivan 67

{'average': 89, 'name': 'Dima'}
[{'average': 89, 'name': 'Dima'}, {'average': 89, 'name': 'Dima'}, {'average': 89, 'name': 'Dima'}, {'average': 89, 'name': 'Dima'}]
Dima 89
[{'average': 89, 'name': 'Dima'}, {'average': 89, 'name': 'Dima'}, {'average': 89, 'name': 'Dima'}, {'average': 89, 'name': 'Dima'}]


Питоном занимаюсь не так давно, но считал себя продвинутым новичком, а теперь разочарован в своих познаниях языка.
помогите разобраться, что я пишу не так?
  • Вопрос задан
  • 1483 просмотра
Решения вопроса 1
@deliro
1. Ты не сказал, какая задача.
2. Побуду Вангой сегодня:

a)
student_struct = {}
summ = 0

Думаю, это стоит внести в цикл.
b) Есть функция sum, которая считает сумму iterable объекта. Причём, намного быстрее, чем реализация на питоне. Подозреваю, что код
summ = 0
for individual_mark in all_marks:
        summ += individual_mark

Можно заменить одной строчкой sum(all_marks)
c) all_marks = student['marks']
Это дублирование непонятно для чего вообще. Можно убрать вовсе.
d)
student_struct = {}
student_struct['name'] = individual_name
student_struct['average'] = summ

Это тоже сокращается в
student_struct = {
    'name': student['Name'],
    'average': sum(student['marks'])
}

e) Непонятно зачем у словаря ключ с большой буквы. Вызывает много путаницы.
В итоге получается примерно следующее:
students_data = [
    {'name': 'Vasya', 'marks': [4, 5, 4, 5, 5]},
    {'name': 'Petya', 'marks': [3, 5, 3, 4, 2, 2]},
    {'name': 'Ivan', 'marks': [4, 5, 4, 4, 4, 4]},
    {'name': 'Dima', 'marks': [4, 5, 4, 3, 3, 3]},
]

average_data = [{'name': student['name'], 'average': sum(student['marks'])} for student in students_data]


P.S. Непонятно, почему сумма называется average.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы