Задать вопрос
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 комментариев
Ответ пользователя Juhani Lahtinen К ответам на вопрос (5)
@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())
Ответ написан
Комментировать