Форум сайта python.su
Дан файл с таблицей в формате TSV с информацией о росте школьников разных классов.
Напишите программу, которая прочитает этот файл и подсчитает для каждого класса средний рост учащегося.
Файл состоит из набора строк, каждая из которых представляет собой три поля:
Класс Фамилия Рост
Класс обозначается только числом. Буквенные модификаторы не используются. Номер класса может быть от 1 до 11 включительно. В фамилии нет пробелов, а в качестве роста используется натуральное число, но при подсчёте среднего требуется вычислить значение в виде вещественного числа.
Выводить информацию о среднем росте следует в порядке возрастания номера класса (для классов с первого по одиннадцатый). Если про какой-то класс нет информации, необходимо вывести напротив него прочерк, например:
Sample Input:
6 Вяххи 159
11 Федотов 172
7 Бондарев 158
6 Чайкина 153
Sample Output:
1 -
2 -
3 -
4 -
5 -
6 156.0
7 158.0
8 -
9 -
10 -
11 172.0
Time Limit: 5 mins
Офлайн
А эту задачу я здесь не нашёл.
Офлайн
with open("file.tsv", "r") as f: a = {str(i): [] for i in range(1, 12)} [a[i[0]].append(int(i[2])) for i in map(lambda x: x.split('\t'), f.read().split('\n'))] [print(i,sum(a[i])/len(a[i]) if len(a[i]) > 0 else '-' ) for i in map(str, range(1, 12))]
Офлайн
terabayt, спасибо. Но на самом деле надо, чтобы программа из *.txt файла читала ввод.
Вот на этом примере ваша программа у меня не работает.
3 Winter 139
11 Gerald 171
8 Holiday 162
2 Crossman 133
8 MacDonald 162
7 Johnson 155
1 Jerome 130
11 Flatcher 176
11 Macduff 177
10 Oldridge 165
8 Fraser 166
1 Brown 130
7 Salisburry 157
7 Murphy 159
11 Ryder 179
1 Davidson 121
7 Ford 163
7 Arthurs 165
3 Macduff 134
2 Oldman 127
9 Thomson 170
10 Simon 165
7 Taylor 163
3 Roger 130
7 Davidson 165
10 Adamson 170
9 Forman 167
11 Audley 179
4 Marshman 140
10 Jenkin 174
7 Gustman 164
1 Carroll 121
2 Coleman 126
10 Turner 174
6 Salisburry 160
1 Forman 128
4 Oldridge 136
3 Wallace 136
8 Berrington 161
11 Edwards 179
6 Addington 156
9 Stanley 172
6 Stevenson 151
10 Carter 174
1 Salomon 126
6 Wesley 154
10 Charlson 166
3 Blomfield 133
7 MacAlister 162
7 Bush 165
2 Baldwin 126
6 Fulton 157
8 Mason 169
2 Fraser 126
9 Boolman 174
1 Warren 125
6 Oakman 156
11 Ford 170
10 MacAlister 167
5 Osborne 145
3 Nicholson 130
7 Milton 162
8 Austin 165
1 Forman 121
5 Macey 140
11 Johnson 179
11 Osborne 176
1 Thomson 124
4 Daniels 138
11 Gill 170
10 Gustman 166
3 Roberts 140
2 Watson 133
8 Creighton 169
10 Russel 175
10 Thornton 169
2 Oswald 126
10 Gustman 165
5 Charlson 146
10 Foster 165
4 Fisher 135
7 Timmons 158
11 Macduff 171
4 Nicholson 137
7 Anderson 164
2 Watson 133
7 Kennett 162
1 Cook 130
10 Carroll 174
5 Allford 140
3 Kennedy 139
2 Blomfield 125
5 Peterson 146
10 Hamphrey 171
1 Oldridge 121
11 Faber 179
4 Clapton 139
8 Milton 169
2 Shackley 132
7 Carrington 158
6 Eddington 150
3 Taft 133
8 Gerald 165
9 Laird 172
6 Morrison 153
10 Adderiy 169
4 Blare 144
8 Youmans 170
8 Kendal 168
Офлайн
terabayt, всё спасибо. Программа полностью работает. Просто в конце файла был перевод каретки на новую строку, поэтому программа выдавала ошибку.
Офлайн
Доброго времени суток,
покажите как решили задачу. Совсем не могу розобратся (
Офлайн
nastyakerchnikova
что у вас не получается? мой код не работает?
Офлайн
terabaytНе запускается.
nastyakerchnikovaчто у вас не получается? мой код не работает?
Офлайн
у вас последняя строка пустая! уберите ее
или вот, я малек изменил:
with open("file.tsv", "r") as f: a = {str(i): [] for i in range(1, 12)} [a[i[0]].append(int(i[2])) for i in map(lambda x: x.split('\t'), f.read().split('\n')) if i[0]] [print(i,sum(a[i])/len(a[i]) if len(a[i]) > 0 else '-' ) for i in map(str, range(1, 12))]
Офлайн
terabayt, вот мой вариант :
with open('in.txt', 'r') as f, open('out.txt', 'w') as g: s = [] v = 0 for line in f: s += line.split() v += 1 t = [0] * 11 t2 = [0] * 11 k = 0 for i in range(2, v * 3, 3): k = int(s[i - 2]) if 1 <= k <= 11: t[k - 1] += int(s[i]) t2[k - 1] += 1 for i in range(0, 11): value = [i + 1, ' ', t[i] / t2[i], '\n'] for x in value: g.write(str(x))
Офлайн