Как найти сумму чисел в файле питон

В каждой строке файла могут встречаться цифры и другие символы. Число -последовательность цифр, которая не может быть расширена до большего числа. При этом если перед числом стоит символ «-«, то оно считается отрицательным.
Найти сумму всех чисел в этом файле.
input.txt
Sochi-2014
output.txt -2014

input.txt
a1b2c10d
output.txt
13

input = open('input.txt', 'r')
output = open('output.txt', 'w')
s = input.read()
l = len(s)
c = input.read(1)
sum2=0
x=0
sum1=[]
while l>0: 
        if c.isdigit!= 0:
                x+=int(c)#ошибка здесь
                sum1.append(x)
        c = input.read(1)
        l-=1
for i in range(len(sum1)):
        sum2+=sum1[i]
output.write(sum2)
input.close()
output.close() 

Что нужно исправить? На данный момент в output.txt ничего не появляется

задан 28 мая 2017 в 15:58

Julia Ponomareva's user avatar

3

import re
Pattern = re.compile(r'-?d+')
def foo(path):
    with open(path, 'r') as File:
        lst = [int(x) for x in re.findall(Pattern, File.read())]
    return sum(lst)

Использование:

print(foo(r'C:UsersuserDesktopDKOM-Rootkit-masternumbers.txt'))

В файл я положил:

a1b2c10d-15 -5.6

Результат:

-1

Еще вариант с lambda функцией:

In [18]: foo = lambda path: sum(map(int, re.findall(r'-?d+', open(path).read())))

In [19]: foo(r'C:UsersuserDesktopDKOM-Rootkit-masternumbers.txt')
Out[19]: -1

ответ дан 28 мая 2017 в 16:21

Pavel Durmanov's user avatar

Pavel DurmanovPavel Durmanov

5,6683 золотых знака21 серебряный знак44 бронзовых знака

4

Более приближённое к вашему варианту решение. Вам должно быть понятно. Так, как делаете вы — не очень хорошо. Очень много переменных, причём названия не очень понятные. Упрощайте.

И не надо называть переменные, как функции. Например, input, sum.

import re # импортируем модуль регулярных выражений

inp = open('input.txt', 'r')
out = open('output.txt', 'a')
summ = 0

numbers = inp.read() # читаем файл
numbers = re.findall(r'[+-]?d+', numbers) # находим все числа без/с префиксами + и -
numbers = [int(x) for x in numbers] # приводим числа к типу int с помощью list comprehension

# суммируем числа
for x in numbers:
    summ += x

out.write(str(summ)) # записываем результат, обязательно в виде строки

# закрываем файлы
inp.close()
out.close()

ответ дан 28 мая 2017 в 20:34

2

This is most compact code I can think of right now:
(updated to handle the n at the end, thanks, @JonClements!)

with open('file.txt', 'r') as fin:
    ans = sum(int(line) for line in fin if line.strip().isnumeric())

For the code structure you have, you can also go for this:

f = open('data.txt', 'r')
ans = 0
for line in f:
    try:
        ans += int(line.strip())
    except ValueError:
        pass

Edit:
Since the confusion with the ‘n’ has been cleared, the first example can be as simple as

with open('file.txt', 'r') as fin:
    ans = sum(int(line) for line in fin)

Or even this one-liner:

ans = sum(int(line) for line in open('file.txt', 'r'))

But there are certain risks with file handling, so not strongly recommended.

Landsberg17

2 / 3 / 0

Регистрация: 22.01.2020

Сообщений: 46

1

Подсчёт суммы чисел в файле

15.02.2020, 12:01. Показов 12710. Ответов 18

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Есть Файл, в котором может быть записана любая абракадабра. числом считается всё, что состоит из цифр. т.е. aft34hy5 будет 34 и 5. числа через пробел тоже считаются последовательностью. то есть 4 5 6 должно восприниматься как 456. нужно найти такие числа и посчитать их сумму. Говорят, лучше всего делать это посимвольно, но как именно, я не въезжаю. есть код, который считает сумму чисел в файле, но так как сделали задачу, чтобы жизнь мёдом не казалась, то она походит не все тесты. что делать?
входные данные
123
aaa456
1x2y3 4 5 6

выходные данные
600

Python
1
2
3
4
5
6
7
8
9
10
11
def main(filename):
    total = []
    with open(filename, "r") as file:
        temp = file.readlines()
        for item in temp:
            total.append(int(item))
    return sum(total)
 
 
if __name__ == '__main__':
    print (main("input.txt"))



0



4611 / 3148 / 1112

Регистрация: 21.03.2016

Сообщений: 7,838

15.02.2020, 12:26

2

Цитата
Сообщение от Landsberg17
Посмотреть сообщение

что делать

как говорил один киногерой — отделить котлеты от мух! в каждой строке выбрать числа по условиям, получить сумму чисел в строке и так для каждой строчки а потом сложить полученные суммы.
вопрос в том как будет считаться строка aft34hy5 35 38?
как 34, 5, 3538 или 34,53538?



0



easybudda

Модератор

Эксперт PythonЭксперт JavaЭксперт CЭксперт С++

11758 / 7258 / 1720

Регистрация: 25.07.2009

Сообщений: 13,272

15.02.2020, 12:30

3

Python
1
2
3
>>> import re
>>> sum(map(lambda x: int(x), re.findall(r'd+', 'abc12e34fg56h')))
102

Добавлено через 3 минуты

Цитата
Сообщение от Landsberg17
Посмотреть сообщение

total.append(int(item))

сведётся к перманентной ловле ValueError



0



Semen-Semenich

4611 / 3148 / 1112

Регистрация: 21.03.2016

Сообщений: 7,838

15.02.2020, 12:33

4

easybudda, не совсем то что нужно

Python
1
2
import re
print(sum(map(lambda x: int(x), re.findall(r'd+', 'abc12e34fg56h 1 2 3'))))

=
108
>>>
а должно быть 12 + 34 + 56 + 123 = 225



0



easybudda

Модератор

Эксперт PythonЭксперт JavaЭксперт CЭксперт С++

11758 / 7258 / 1720

Регистрация: 25.07.2009

Сообщений: 13,272

15.02.2020, 12:50

5

Цитата
Сообщение от Semen-Semenich
Посмотреть сообщение

а должно быть 12 + 34 + 56 + 123 = 225

Это с какого перепуга? Числа 1 2 3, разделённые пробелами — это три числа, а не одно.

Не по теме:

Как в том анекодте:
Карл, Маркс, Фридрих и Энгельс почему-то не 4 человека, а 2. А Слава Капээсэс — вообще не человек…

Другое дело — можно и без lambda обойтись:

Python
1
sum(map(int, re.findall(r'd+', 'abc12e34fg56h')))

точно так же отработает.



0



2 / 3 / 0

Регистрация: 22.01.2020

Сообщений: 46

15.02.2020, 13:17

 [ТС]

6

Цитата
Сообщение от easybudda
Посмотреть сообщение

Числа 1 2 3, разделённые пробелами — это три числа, а не одно.

вот как раз таки я писал, что числа 1 2 3 воспринимаются как 123. а еще я не понимаю как выглядит конечный код



0



easybudda

Модератор

Эксперт PythonЭксперт JavaЭксперт CЭксперт С++

11758 / 7258 / 1720

Регистрация: 25.07.2009

Сообщений: 13,272

15.02.2020, 13:46

7

Цитата
Сообщение от Landsberg17
Посмотреть сообщение

вот как раз таки я писал, что числа 1 2 3 воспринимаются как 123

Не по теме:

«Ну тогда с чесночком…»(с)

Python
1
2
>>> sum(map(lambda x: int(x.replace(' ', '')), re.findall(r'[0-9 ]+', 'abc12e34fg5 6h 1 2 3')))
225

Цитата
Сообщение от Landsberg17
Посмотреть сообщение

а еще я не понимаю как выглядит конечный код

Да так и выглядит. Прочитать файл в строку, если он не 100500 петабайт длиной, подставить её вместо ‘abc…’, радоваться.
Ну или читать по строке, если сразу весь проблематично, дальше думать, как выкручиваться…



0



2 / 3 / 0

Регистрация: 22.01.2020

Сообщений: 46

15.02.2020, 14:15

 [ТС]

8

easybudda я честно не понимаю куда здесь имя файла(input.txt например) засунуть. можете, пожалуйста довершить мысль



0



Dax

Модератор

Эксперт Python

1353 / 650 / 207

Регистрация: 23.03.2014

Сообщений: 3,054

15.02.2020, 15:04

9

Python
1
2
3
4
5
6
7
8
9
def sum_ints_in_file(file_name):
    with open(file_name, 'r') as fp:
        return sum(map(int, fp.read().split()))
 
 
print(sum_ints_in_file('file.txt'))
if __name__ == '__main__':
    filename = input()
    sum_ints_in_file(file_name=)



0



Foxtam

16 / 14 / 12

Регистрация: 02.10.2015

Сообщений: 44

15.02.2020, 15:32

10

123+456+1+2+3456 != 600
123+456+1+2+3+4+5+6 == 600

«4 5 6 должно восприниматься как 456» — это точно?

Добавлено через 5 минут
Результат зависит от наличия строки «text = text.replace(‘ ‘, »)»

Python
1
2
3
4
5
6
import re
 
text = open('input.txt').read()
# text = text.replace(' ', '')
total = sum(map(int, re.findall(r'd+', text)))
print(total)



0



4611 / 3148 / 1112

Регистрация: 21.03.2016

Сообщений: 7,838

15.02.2020, 15:42

11

easybudda, вот в том и загвоздка как это понимать (об этом я сразу и спросил)
‘abc12e34fg5 6h 1 2 3’ ну насчет 1 2 3 понятно а вот fg5 6h как понимать? как 5 и 6 или как 56? вроде и пробел между цифрами и вроде цифры относятся к разным строкам. если как 56 то проще удалить все пробелы выбрать группы цифр и сложить



0



3944 / 2858 / 665

Регистрация: 08.06.2007

Сообщений: 9,668

Записей в блоге: 4

15.02.2020, 16:20

12

Semen-Semenich, В его примере есть фрагмент 1x2y3 4 5 6 Там вроде бы числа 123 и 456 извлекаются отдельно. Это не такой беспощадный случай, как у вас, но в том-то и дело, что ТС игнорирует вопросы, если не знает, как на них отвечать.



0



Рыжий Лис

Просто Лис

Эксперт Python

5089 / 3256 / 1008

Регистрация: 17.05.2012

Сообщений: 9,537

Записей в блоге: 9

15.02.2020, 17:31

13

Цитата
Сообщение от easybudda
Посмотреть сообщение

map(lambda x: int(x),

Проще:

Python
1
map(int,)



0



Модератор

Эксперт PythonЭксперт JavaЭксперт CЭксперт С++

11758 / 7258 / 1720

Регистрация: 25.07.2009

Сообщений: 13,272

15.02.2020, 17:37

14

Цитата
Сообщение от Рыжий Лис
Посмотреть сообщение

Проще

Спасибо, Кэп!

Цитата
Сообщение от easybudda
Посмотреть сообщение

Другое дело — можно и без lambda обойтись



0



2 / 3 / 0

Регистрация: 22.01.2020

Сообщений: 46

15.02.2020, 18:51

 [ТС]

15

я уточнил. пробел разделяет. т.е. dfgjh5 6jdfghk считать как 5 и 6



0



Catstail

Модератор

Эксперт функциональных языков программированияЭксперт Python

35427 / 19452 / 4071

Регистрация: 12.02.2012

Сообщений: 32,486

Записей в блоге: 13

15.02.2020, 19:05

16

А вот так — совсем просто — без промежуточных списков, регулярок и т.п. (хотя по числу строк длиннее, но, не удивлюсь, если быстрее, т.к. всего за один проход):

Python
1
2
3
4
5
6
7
8
9
10
11
def sum_in_str(stri):
    sum=0
    acc=0
    for a in stri:
        if not a in "0123456789":
            sum+=acc
            acc=0
        else:
            acc=acc*10+int(a)
    sum+=acc
    return sum



0



Рыжий Лис

Просто Лис

Эксперт Python

5089 / 3256 / 1008

Регистрация: 17.05.2012

Сообщений: 9,537

Записей в блоге: 9

15.02.2020, 19:15

17

Цитата
Сообщение от Landsberg17
Посмотреть сообщение

я не понимаю. я же написал, что wdfh5 6wejfh воспринимается как 56, а не как 5 и 6. я ответил на этот вопрос уже и не один раз. так и зачем кидать претензию, что я типа не знаю как отвечать? скажу ещё раз. любая, абсолютно любая последовательность цифр, не разделённых буквами считается числом. пробел не считается буквой.

Можно так:

Python
1
2
>>> re.sub(r'[a-zA-Z]', '', 'wdfh5 6wejfh').split()
['5', '6']

Добавлено через 1 минуту

Python
1
2
>>> re.sub(r'[a-zA-Z]', '', '1x2y3 4 5 6').split()
['123', '4', '5', '6']



0



3944 / 2858 / 665

Регистрация: 08.06.2007

Сообщений: 9,668

Записей в блоге: 4

15.02.2020, 19:28

18

Цитата
Сообщение от Landsberg17
Посмотреть сообщение

числа через пробел тоже считаются последовательностью. то есть 4 5 6 должно восприниматься как 456

читаем далее

Цитата
Сообщение от Landsberg17
Посмотреть сообщение

входные данные
123
aaa456
1x2y3 4 5 6
выходные данные
600

Ну и какие числа здесь надо складывать. Я предполагаю 123+456+1+2+3+4+5+6 = 600. И где здесь число 456, которое возникает из 4 5 6? Извиняюсь, если обидел, но у меня уже крыша едет.



0



2 / 3 / 0

Регистрация: 22.01.2020

Сообщений: 46

17.02.2020, 17:46

 [ТС]

19

программа-то выполняется. но куда здесь имя файла засунуть, из которого надо считать. Я искренне извиняюсь, но с файлами в первый раз и вообще не понимаю куда его

Добавлено через 1 час 35 минут
вопрос. Если 5 6 воспринимается как 5 и 6, то эта строка нужна? и как она будет выглядеть?



0



Файлы

Открытие файла

Для каждого файла, с которым необходимо производить операции ввода-вывода,
нужно связать специальный объект — поток. Открытие файла осуществляется
функцией open, которой нужно передать два параметра.
Первый параметр (можно также использовать именованный параметр file)
имеет значение типа str, в котором
записано имя открываемого файла. Второй параметр (можно также использовать именованный
параметр mode) —это
значение типа str, которое равно "r",
если файл открывается для чтения данных (read), "w",
если на запись (write), при этом содержимое файла очищается, и
"a" — для добавления данных в конец
файла (append). Если второй параметр не задан, то считается, что файл
открывается в режиме чтения.

Функция open возвращает ссылку на файловый объект, которую
нужно записать в переменную, чтобы потом через данный объект использовать
методы ввода-вывода. Например:

input = open('input.txt', 'r')
output = open('output.txt', 'w')

Чтение данных из файла

Для файла, открытого на чтение данных, можно вызывать следующие методы, позволяющие
читать данные из файла.

Метод readline() считывает одну строку из файла (до символа
конца строки 'n', возвращается считанная строка вместе с символом
'n'. Если считывание не было успешно (достигнут конец файла),
то возвращается пустая строка. Для удаления символа 'n' из конца
файла удобно использовать метод строки rstrip(). Например:
s = s.rstrip().

Метод readlines() считывает все строки из файла и возвращает
список из всех считанных строк (одна строка — один элемент списка).
При этом символы 'n' остаются в концах строк.

Метод read() считывает все содержимое из файла и возвращает
строку, которая может содержать символы 'n'. Если методу
read передать целочисленный параметр, то будет считано не более
заданного количества символов. Например, считывать файл побайтово можно
при помощи метода read(1).

Вывод данных в файл

Данные выводятся в файл при помощи метода write,
которому в качестве параметра передается одна строка. Этот метод не выводит
символ конца строки 'n' (как это делает функция print
при стандартном выводе), поэтому для перехода на новую строку в файле
необходимо явно вывести символ 'n'.

Также можно выводить данные в файл при помощи функции print,
если передать ей еще один именованный параметр file, равный
ссылке на открытый файл. Например:

output = open('output.txt', 'w')
print(a, b, c, file=output)

Закрытие файла

После окончания работы с файлом необходимо закрыть его при помощи метода
close().

Пример

Следующая программа считывает все содержимое файла input.txt,
записывает его в переменную s, а затем выводит ее в файл output.txt.

input = open('input.txt', 'r')
output = open('output.txt', 'w')
s = input.read()
output.write(s)
input.close()
output.close()

А вот аналогичная программа, но читающая данные посимвольно:

input = open('input.txt', 'r')
output = open('output.txt', 'w')
c = input.read(1)
while len(c) > 0:
    output.write(c)
    c = input.read(1)
input.close()
output.close()

Упражнения

Входные данные для всех задач записаны в файле input.txt,
результат работы нужно вывести в файл output.txt.

A: A + B

Во входном файле записано два целых числа, каждое в отдельной строке.
Выведите в выходной файл их сумму.

Ввод Вывод
2
2
4

B: Числа могут быть где угодно

Во входном файле записано два целых числа, которые могут быть разделены пробелами и концами строк.
Выведите в выходной файл их сумму.

Указание. Считайте весь файл в строковую переменную при помощи метода read()
и разбейте ее на части при помощи метода split().

Ввод Вывод
  2

 2

4

C: Обращение строки

Во входном файле записана одна текстовая строка, возможно,
содержащая пробелы. Выведите эту строку в обратном порядке.

Строка во входном файле заканчивается символом конца строки 'n'.

Ввод Вывод
hello world
dlrow olleh

D: Построчное обращение

Выведите все строки данного файла в обратном порядке.
Для этого считайте список всех строк при помощи метода readlines().

Последняя строка входного файла обязательно заканчивается символом 'n'.

Ввод Вывод
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Complex is better than complicated.
Simple is better than complex.
Explicit is better than implicit.
Beautiful is better than ugly.

E: Обращение всего файла

Выведите в обратном порядке содержимое всего файла полностью. Для этого считайте
файл целиком при помощи метода read().

Ввод Вывод
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.

.detacilpmoc naht retteb si xelpmoC
.xelpmoc naht retteb si elpmiS
.ticilpmi naht retteb si ticilpxE .ylgu naht retteb si lufituaeB

F: Длинные строки

В выходной файл выведите все строки наибольшей длины из входного файла, не меняя их порядок.

В данной задаче удобно считать список строк входного файла целиком при помощи
метода readlines().

Ввод Вывод
One
Twenty one
Two
Twenty two
Twenty one
Twenty two

G: Поиск символа

Определите, есть ли во входном файле символ '@'. Выведите
слово YES или NO.

Входной файл может быть очень большим, поэтому считывать файл нужно
посимвольно.

Ввод Вывод
Valid email:
Bilbo.Baggins@bagend.hobbiton.shire.me
YES
Hello, world!
NO

H: Сумма чисел в строкaх

Дан файл, каждая строка которого может содержать одно или несколько целых чисел,
разделенных одним или несколькими пробелами.

Вычислите сумму чисел в каждой строке и выведите эту сумму (для каждой строки выводится сумма чисел в этой строке).

В данной задаче удобно считывать данные построчно.

Ввод Вывод
2 2
3 4
1 5
4
7
6

I: Сумма чисел в файле

В файле могут быть записаны десятичные цифры и все, что угодно. Числом назовем последовательность
цифр, идущих подряд (т.е. число всегда неотрицательно).

Вычислите сумму всех чисел, записанных в файле. В данной задаче удобно считывать данные посимвольно.

Ввод Вывод
 123
aaa456
1x2y3 4 5 6
600

J: Статистика по файлу

Дан файл. Определите сколько в нем букв (латинского алфавита), слов, строк. Выведите три найденных числа
в формате, приведенном в примере.

Для экономии памяти читайте файл посимвольно, то есть не сохраняя целиком в памяти файл или
отдельные его строки.

Ввод Вывод
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Input file contains:
108 letters
20 words
4 lines

K: Шифр Цезаря — 2

Зашифруйте данный текстовый файл шифром Цезаря, при этом символы первой строки
файла должны циклически сдвигаться на 1, второй строки — на 2, третьей
строки — на три и т.д.

В этой задаче удобно считывать файл построчно, шифруя каждую строку в отдельности.

Ввод Вывод
Hello
Hello
Hello
Hello
Ifmmp
Jgnnq
Khoor
Lipps

L: Максимальный балл по классам

В олимпиаде по информатике принимало участие несколько человек.
Информация о результатах олимпиады записана в файле,
каждая строка которого имеет вид:
фамилия имя класс балл.

Фамилия и имя — текстовые строки, не содержащие пробелов.
Класс — одно из трех чисел 9, 10, 11. Балл — целое число от 0
до 100.

Победителем олимпиады становится человек, набравший больше всех
баллов. Победители определяются независимо по каждому классу.

Определите количество баллов, которое набрал победитель
в каждом классе. Гарантируется, что в каждом классе был хотя бы один участник.

Выведите три числа: баллы победителя олимпиады по 9 классу, по 10 классу, по 11 классу.

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

Ввод Вывод
Иванов Сергей 9 90
Сергеев Петр 10 91
Петров Василий 11 92
Васильев Иван 9 93
93 91 92

M: Средний балл по классам

В условиях предыдущей задачи определите и выведите средние баллы
участников олимпиады в 9 классе, в 10 классе, в 11 классе.

Ввод Вывод
Иванов Сергей 9 90
Сергеев Петр 10 91
Петров Василий 11 92
Васильев Иван 9 93
91.5 91 92

N: Количество победителей по классам

В условиях предыдущей задачи определите количество школьников, ставших победителями
в каждом классе. Победителями объявляются все, кто набрал наибольшее число баллов по данному классу.
Гарантируется, что в каждом классе был хотя бы один участник.

Выведите три числа: количество победителей олимпиады по 9 классу, по 10 классу, по 11 классу.

Ввод Вывод
Иванов Сергей 9 80
Сергеев Петр 10 80
Петров Василий 11 81
Васильев Андрей 9 81
Андреев Александр 10 80
Александров Роман 9 81
Романов Иван 11 80
2 2 1

O: Победитель олимпиады

Зачет в олимпиаде проводится без деления на классы.
Выведите фамилию и имя победителя олимпиады.
Если таких несколько — выведите только их количество.

Ввод Вывод
Иванов Сергей 9 90
Сергеев Петр 10 95
Петров Иван 11 85
Сергеев Петр
Иванов Сергей 9 90
Сергеев Петр 10 85
Петров Иван 11 90
2

P: Максимальный балл не-победителя

Зачет проводится отдельно в каждом классе. Победителями олимпиады становятся
школьники, которые набрали наибольший балл среди всех участников в данном классе.

Для каждого класса определите максимальный балл, который набрал школьник,
не ставший победителем в данном классе.

Выведите три целых числа.

Ввод Вывод
Иванов Сергей 9 80
Сергеев Петр 10 82
Петров Василий 11 82
Васильев Андрей 9 81
Андреев Александр 10 81
Александров Роман 9 81
Романов Иван 11 83
80 81 82

Q: Максимальный балл призера и их количество

Результаты олимпиады подводятся без деления на классы. Победителем
олимпиады становятся те, кто набрал больше всего баллов. Призерами олимпиады
становятся участники, следующие за победителями.

Определите наибольший балл, который набрали призеры олимпиады и количество
участников олимпиады, набравших такой балл. Выведите два числа: наибольший
балл призера и количество участников, имеющий такой балл.

Ввод Вывод
Иванов Сергей 9 92
Сергеев Петр 10 91
Петров Василий 11 92
Васильев Иван 9 93
92 2

R: Имя наилучшего не-победителя

В условиях предыдущей задачи выведите фамилию и имя участника олимпиады,
набравшего наибольший балл, но не ставшего победителем. Если таких школьников
несколько — выведите их количество.

Ввод Вывод
Иванов Сергей 9 93
Сергеев Петр 10 91
Петров Василий 11 92
Васильев Иван 9 93
Петров Василий
Иванов Сергей 9 92
Сергеев Петр 10 91
Петров Василий 11 92
Васильев Иван 9 93
2

S: Школы с наибольшим числом участников олимпиады

В олимпиаде по информатике принимало участие N человек.
Информация о результатах олимпиады записана в файле, каждая из строк которого имеет вид:
фамилия имя школа балл

Фамилия и имя — текстовые строки, не содержащие пробелов.
Школа — целое число от 1 до 99. Балл — целое число от 0
до 100.

Определите школы, из которых в олимпиаде принимало участие больше
всего участников. Выведите номера этих школ в порядке возрастания.

В этой задаче необходимо считывать данные построчно, не сохраняя в памяти
данные обо всех участниках, а только подсчитывая число участников для каждой школы.

Ввод Вывод
Иванов Сергей 14 56
Сергеев Петр 23 74
Петров Василий 3 99
Васильев Андрей 3 56
Андреев Роман 14 75
Романов Иван 27 68
3 14

T: Школы с наименьшим числом участников олимпиады

В условиях предыдущей задачи определите школы,
из которых в олимпиаде принимало участие меньше
всего участников (но был хотя бы один участник).
Выведите номера этих школ в порядке возрастания.

Ввод Вывод
Иванов Сергей 14 56
Сергеев Петр 23 74
Петров Василий 3 99
Васильев Андрей 3 56
Андреев Роман 14 75
Романов Иван 27 68
23 27

U: Отсортировать список участников по алфавиту

Известно, что фамилии всех участников — различны. Сохраните в массивах
список всех участников и выведите его, отсортировав по фамилии в лексикографическом
порядке.

При выводе указываете фамилию, имя участника и его балл.

Ввод Вывод
Иванов Сергей 14 56
Сергеев Петр 23 74
Петров Василий 3 99
Васильев Андрей 3 56
Андреев Роман 14 75
Романов Иван 27 68
Андреев Роман 75
Васильев Андрей 56
Иванов Сергей 56
Петров Василий 99
Романов Иван 68
Сергеев Петр 74

V: Отсортировать список участников по баллам

Отсортируйте список участников олимпиады:

  1. По убыванию набранного балла.
  2. При равных значения балла — по фамилии в лексикографическом порядке.
  3. При совпадающих баллах и фамилии — по имени в лексикографическом порядке.

Выведите список в таком же виде, как в предыдущей задаче.

Ввод Вывод
Иванов Сергей 14 75
Сергеев Петр 23 74
Сергеев Андрей 3 99
Петров Василий 3 99
Иванов Роман 14 75
Иванов Иван 27 76
Петров Василий 99
Сергеев Андрей 99
Иванов Иван 76
Иванов Роман 75
Иванов Сергей 75
Сергеев Петр 74

W: Школы, в которых есть победители олимпиады

В условиях предыдущей задачи выведите в порядке возрастания номера школ,
в которых есть хотя бы один победитель олимпиады.

Ввод Вывод
Иванов Сергей 13 80
Сергеев Петр 26 70
Сергеев Андрей 35 80
Петров Василий 13 80
Иванов Роман 35 70
Иванов Иван 26 70
13 35

X: Школы с высоким средним баллом

В условиях предыдущей задачи выведите в порядке возрастания номера школ,
средний балл учащихся которых выше, чем средний балл всех участников олимпиады
(то есть необходимо вычислить средний балл для каждой школы и средний балл по всем участникам).

Ввод Вывод
Иванов Сергей 13 45
Сергеев Петр 13 45
Сергеев Андрей 20 55
Петров Василий 20 55
Иванов Роман 70 40
Иванов Иван 70 60
20

Y: Школы с наибольшим средним баллом

В условиях предыдущей задачи выведите в порядке возрастания номера школ,
средний балл учащихся которых максимален (то есть необходимо вычислить
средний балл для каждой школы и вывести те школы, средний балл для которых
максимален).

Ввод Вывод
Иванов Сергей 13 45
Сергеев Петр 13 45
Сергеев Андрей 20 55
Петров Василий 20 55
Иванов Роман 70 40
Иванов Иван 70 60
20

Z: Список школ упорядоченный по числу участников

В условиях предыдущей задачи выведите номера школ, из которых был
хотя бы один участник олимпиады, в порядке убывания количества
участников олимпиады из этих школ. Если из двух школ было одинаковое число
участников, то их номера выводятся в порядке возрастания номера школы.

Ввод Вывод
Иванов Сергей 13 45
Сергеев Петр 70 45
Сергеев Андрей 20 55
Петров Василий 14 55
Иванов Роман 13 40
Иванов Иван 70 60
13 70 14 20

ZA: Список школ упорядоченный по среднему баллу участников

В условиях предыдущей задачи выведите номера школ, из которых был
хотя бы один участник олимпиады, в порядке убывания среднего балла
участников олимпиады из этих школ. Если для двух школ средний балл
участников совпадает, то их номера выводятся в порядке
возрастания номера школы.

Ввод Вывод
Иванов Сергей 13 45
Сергеев Петр 13 45
Сергеев Андрей 20 55
Петров Василий 20 55
Иванов Роман 70 40
Иванов Иван 70 60
20 70 13

ZB: Школы с наибольшим числом победителей

В условиях предыдущей задачи выведите в порядке возрастания
номера школ, из которых наибольшее количество участников стало
победителями олимпиады.

Ввод Вывод
Иванов Сергей 13 70
Сергеев Петр 13 60
Сергеев Андрей 20 70
Петров Василий 20 70
Иванов Роман 70 60
Иванов Иван 70 60
20

Это самый компактный код, о котором я могу думать прямо сейчас: (обновлено, чтобы обрабатывать n в конце, спасибо, @JonClements!)

with open('file.txt', 'r') as fin:
    ans = sum(int(line) for line in fin if line.strip().isnumeric())

Для структуры кода, которую вы имеете, вы также можете воспользоваться этим:

f = open('data.txt', 'r')
ans = 0
for line in f:
    try:
        ans += int(line.strip())
    except ValueError:
        pass

Изменить: поскольку путаница с «n» была очищена, первый пример может быть таким простым, как

with open('file.txt', 'r') as fin:
    ans = sum(int(line) for line in fin)

Или даже этот однострочный:

ans = sum(int(line) for line in open('file.txt', 'r'))

Но есть определенные риски при обработке файлов, поэтому настоятельно не рекомендуется.

Понравилась статья? Поделить с друзьями:

Не пропустите также:

  • Составить рассказ как я провел выходные 2 класс
  • Если почва кислая как исправить
  • Где найти марио как на денди
  • Как найти местоположение пользователя
  • Как найти телефон хонор 9 икс

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии