Задать вопрос
Bobibekov
@Bobibekov

Как вычислить среднюю величину двумерного списка по вертикали?

Есть файл со студентами и оценками по трем предметам каждого студента, такого типа:
Петров;85;92;78
Сидоров;100;88;94
Иванов;58;72;85

На выходе нужно получить - среднюю оценку всех предметов ученика и в последней строчке среднюю оценку по каждому предмету всех учеников:
85.0
94.0
71.666666667
81.0 84.0 85.666666667

with open('datain.txt', 'r', encoding='utf-8') as infile, open('dataout.txt', 'w', encoding='utf-8') as outfile:
    temp_2d_list = []
    for line in infile:
        temp_line_list = line.strip().split(';')[1:]   # строка списка без первого элемента (имени)
        temp_2d_list.append(temp_line_list)            # тут заполняю двумерный список

    sum_row = 0
    average = 0

    # вычисление средней оценки предметов студента
    for row in range(len(temp_2d_list)):
        for col in range(len(temp_2d_list[row])):
            sum_row += int(temp_2d_list[row][col])
            print(temp_2d_list[row][col], end=' ')
        average = sum_row / len(temp_2d_list[row])
        sum_row = 0
        print()
        outfile.write(str(average) + '\n')

    # --------> Тут не удается. Не вычисляется средняя оценка каждого предмета по всем ученикам
   # Хочу сделать общий  случай, при разном кол-ве учеников и разном кол-ве предметов
    # вычисление средней оценки каждого предмета всех учеников
    for col in range(len(temp_2d_list[row])):
        for row in range(len(temp_2d_list)):
            sum_row += float(temp_2d_list[row][col])
            #print(sum_row, end='')
        average = sum_row / len(temp_2d_list[row])
        sum_row = 0
        print(str(average), end=' ')
        outfile.write(str(average) + ' ')


Вывод такой:
(всего 3 величины а не 4, и не пойму почему именно такие значения)
5e302e9b59ef9206281183.png
Основной вопрос: Как пробегаться по вертикали двумернго списка (сумировать элементы или еще что..)
5e302f0682e0f081195474.jpeg
  • Вопрос задан
  • 141 просмотр
Подписаться 1 Простой 5 комментариев
Решения вопроса 1
Bobibekov
@Bobibekov Автор вопроса
# вычисление средней оценки каждого предмета всех учеников
    count_students = len(temp_2d_list)
    count_school_subjects = len(temp_2d_list[0])

    for col in range(count_school_subjects):
        for row in range(count_students):
            sum_row += float(temp_2d_list[row][col])
        average = sum_row / len(temp_2d_list)
        sum_row = 0
        print(str(average), end=' ')
        outfile.write(str(average) + ' ')
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
@Drill
for row in temp_2d_list:
    print(sum(map(int,row))/len(row))
for row in zip(temp_2d_list):
    print(sum(map(int,row))/len(row), end=' ')
Ответ написан
Комментировать
@anerev
import functools
list1 = [[1, 2, 3], [1, 2, 3], [1, 2, 3]]
functools.reduce(lambda x, y: x + y, [row[0] for row in list1]) // len(list1)

for list2 in range(len(list1)):
    sum([row[list2] for row in list1])) // len(list1)
Ответ написан
Комментировать
# Ваш файл
file = """
Петров;85;92;78
Сидоров;100;88;94
Иванов;58;72;85
""".strip().split('\n')
# преобразуем в данные
data = {v[0]: list(map(float, v[1:])) for v in (s.split(';') for s in file)}
print(data)
# разворачиваем ваш список и считаем
avg = {i: f'sum({l})/{len(l)} = {sum(l) / len(l)}' for i, l in enumerate(zip(*data.values()))}
print(avg)

результат
{'Петров': [85.0, 92.0, 78.0], 'Сидоров': [100.0, 88.0, 94.0], 'Иванов': [58.0, 72.0, 85.0]}
{0: 'sum((85.0, 100.0, 58.0))/3 = 81.0', 1: 'sum((92.0, 88.0, 72.0))/3 = 84.0', 2: 'sum((78.0, 94.0, 85.0))/3 = 85.66666666666667'}
Ответ написан
Комментировать
@nukler
местный юродивый
ееее, говнокод!!!
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os
import sys

def main():
	summ_s_row_now = int(0)
	line_iters = int(0)
	row_iters = int(0)
	str_res_line = str()
	int_tpl_data = dict()
	with open('in.csv', 'r', encoding='utf-8') as infile, open('out.csv', 'w', encoding='utf-8') as outfile:
		for row_now in infile:
			str_res_line = str(row_now.split(";")[0])
			for i,s_row_now in enumerate(row_now.split(";")[1:]):
				if int_tpl_data.get(i):
					int_tpl_data[i] += int(s_row_now)
				else:
					int_tpl_data[i] = int(s_row_now)
				summ_s_row_now += int(s_row_now)
				str_res_line += str(f""", {s_row_now}""").replace("\n", "")
				line_iters += 1
			int_tpl_data[line_iters + 1] = round(summ_s_row_now/line_iters,2)
			str_to_file = str(f"""{str_res_line}, {int_tpl_data[line_iters + 1]}\n""")
			outfile.write(str_to_file)
			print(str_to_file)
			summ_s_row_now = 0
			line_iters = 0
			row_iters += 1
			
		outfile.write(f"""SUMM/{row_iters}""")
		print(f"""SUMM/{row_iters}""", end = "")
		for e,i in enumerate(int_tpl_data,1):
			if e == len(int_tpl_data):
				continue
			str_to_file = str(f""", {round(int_tpl_data[i]/row_iters,2)} """)
			outfile.write(str_to_file)
			print(str_to_file, end = "")
		print()

if __name__ == "__main__":
	sys.exit(main())
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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