Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
2 / 1 / 1
Регистрация: 29.03.2022
Сообщений: 22

Вычисляем баланс счетов, сортируем по сумме

19.04.2022, 01:30. Показов 2220. Ответов 9

Студворк — интернет-сервис помощи студентам
Есть такая задача:
ОТЧЕТ ПО СЧЕТАМ Напишите программу, которая проходит по всем операциям в файле bank.txt, а после выводит все счета и баланс каждого счета.

Данные нужно вывести в следующем формате: Счет1 Баланс1;Счет2 Баланс2;Счет N; Баланс N. То есть счета между собой разделены точкой с запятой, а каждый счет по отдельности содержит свой номер и баланс, разделенные пробелом.

Счета нужно выводить в порядке увеличения баланса (см. пример отчета ниже). В файле есть счет 000 — это внутренний счет банка, его выводить не надо:

000;123;200
123;456;100
456;789;200
789;123;500

Пример отчета (на основе данных из условия):
789 -300;456 -100;123 600

Код ниже считает сумму по каждому счету и формирует список, который сортируется последним циклом. Отсортировать нужно без использования sort, lambda или функций, только циклами и условиями. Последний цикл находит минимальную сумму и записывает ее в новый список. Затем нужно этот элемент удалить и я не знаю как это сделать. После удаления ищем следующую минимальную сумму и тд. Если удалить его после строки outsort.append(minn) то сортировка не получится. Как удалить элемент правильно, для реализации описанной логики?

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
from sys import argv
check = argv[1]
a = open("bank.txt", "r", encoding="utf8").readlines()
listcheck = []
for x in a:
    if not x[:x.find(";")] in listcheck:
        listcheck.append(x[:x.find(";")])
    if not x[x.find(";") + 1:x.find(";", x.find(";") + 1)] in listcheck:
        listcheck.append(x[x.find(";") + 1:x.find(";", x.find(";") + 1)])
#print(listcheck)
summ = 0
out = []
for y in listcheck:
    if y == "000":
        continue
    for x in a:
        endout = x.find(";")
        endinc = x.find(";", endout + 1)
 
        outcome = x[:endout]
        income = x[endout + 1:endinc]
        money = x[endinc + 1:]
        if y == outcome:
            summ -= int(money)
        if y == income:
            summ += int(money)
    out.append(str(y) + " " + str(summ))
    summ = 0
print(out)
 
q = 1
minn = "999 99999999"
outsort = []
while q <= len(out):
    for i, x in enumerate(out):
        if int(minn[4:]) > int(x[4:]):
            minn = x
    outsort.append(minn)
    q += 1
 
print(outsort)
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.04.2022, 01:30
Ответы с готовыми решениями:

Сортируем по дате, с дополнением
Всем привет!) Нужна помощь! Короче в MySQL есть поле формата DATE. На главной я их извлекаю из БД и вывожу подряд все. Ну при нажатии...

Сортируем лист слиянием
Здравствуйте, уважаемые форумчане! Посмотрите, пожалуйста, программу. Цель программы: отсортировать список (индексированый список)...

Дана строка. Посчитать баланс скобок ([{ . Баланс открытых к закрытым
Прошу помощи. String S1 = textBox1.Text.ToLower(); for (int i = 0; i &lt; S1.Length; i++) { int...

9
2 / 2 / 0
Регистрация: 17.04.2022
Сообщений: 12
19.04.2022, 09:56
Попробуй использовать .pop() эта функция удаляет элемент списка и возвращает его значение (если я правильно понял твою проблему)
Пример:
new_list.append(old_list.pop(min_num))
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38168 / 21103 / 4307
Регистрация: 12.02.2012
Сообщений: 34,692
Записей в блоге: 14
19.04.2022, 10:32
Ihor2022, что означают поля этой записи 789;123;500? 789 - номер счета. Что такое 123 и 500?
0
2 / 1 / 1
Регистрация: 29.03.2022
Сообщений: 22
19.04.2022, 13:05  [ТС]
Catstail Со счета 789на счет 123 перевели 500 денежных едениц.
И так по каждой транзакции.

Данные нужно вывести в следующем формате: Счет1 Баланс1;Счет2 Баланс2;Счет N; Баланс N. То есть счета между собой разделены точкой с запятой, а каждый счет по отдельности содержит свой номер и баланс, разделенные пробелом.

Пример отчета (на основе данных из условия):
789 -300;456 -100;123 600

Добавлено через 1 минуту
giguck, в этом проблема и заключается. Ты предлагаешь уменьшить длину списка во время цикла или другим способом, каким?

Если во время цикла то при очередной итерации мы пропустим следующий элемент списка. А чтоб найти минимальное значение нужно перебрать все элементы списка out. После завершения цикла записать минимальное значение в новый список outsort. Затем удалить это значение из out и начать цикл заново для поиска очередного минимального значения. Если я вствляю код для удаления после или перед циклом то алгоритм не работает.

Я знаю что можно режить другими алгоритмами, например, не создавать новый список outsort, а менять значения местами в out, но мне нужно разобраться как режить описанным в условии алгоритмом.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38168 / 21103 / 4307
Регистрация: 12.02.2012
Сообщений: 34,692
Записей в блоге: 14
19.04.2022, 14:25
Ihor2022, а входящие остатки нулевые?
0
2 / 1 / 1
Регистрация: 29.03.2022
Сообщений: 22
19.04.2022, 15:37  [ТС]
Добавлено через 3 минуты
Catstail, Суммы на счетах до начала этих операций не должны использоваться в расчетах по условию задания. Ценными есть только транзакции за определенный период. Транзакции в условии. И они правильно считаются кодом что выше. С этим проблем нету.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38168 / 21103 / 4307
Регистрация: 12.02.2012
Сообщений: 34,692
Записей в блоге: 14
19.04.2022, 17:56
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
def balans(fprov):
    res={}
    with open(fprov,"r") as fi:
        for line in fi:
            (c_from,c_to,summ)=map(int,line.split(";"))
            if res.get(c_from) is None:
                res[c_from]=0
            if res.get(c_to) is None:
                res[c_to]=0
            res[c_from]=res[c_from]-summ
            res[c_to]=res[c_to]+summ
    
    tmp=[]        
    for count in res.keys():
        if count != 0:
            tmp.append((count,res[count]))
    tmp.sort(key=lambda pair: pair[1])        
    
    strout=""
    for pair in tmp:
        strout=strout+str(pair[0])+" "+str(pair[1])+";"
    ls=len(strout)
    return strout[0:ls-1]
 
print(balans("prov.txt"))
Файл prov.txt

000;123;200
123;456;100
456;789;200
789;123;500

Вывод:

789 -300;456 -100;123 600
1
2 / 1 / 1
Регистрация: 29.03.2022
Сообщений: 22
19.04.2022, 18:10  [ТС]
Catstail, Спасибо большое!
С помощью функций sort, lambda все работает правильно

Но отсортировать нужно без использования sort, lambda или функций, только циклами и условиями.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38168 / 21103 / 4307
Регистрация: 12.02.2012
Сообщений: 34,692
Записей в блоге: 14
19.04.2022, 18:19
Лучший ответ Сообщение было отмечено Ihor2022 как решение

Решение

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
def balans(fprov):
    res={}
    with open(fprov,"r") as fi:
        for line in fi:
            (c_from,c_to,summ)=map(int,line.split(";"))
            if res.get(c_from) is None:
                res[c_from]=0
            if res.get(c_to) is None:
                res[c_to]=0
            res[c_from]=res[c_from]-summ
            res[c_to]=res[c_to]+summ
    
    tmp=[]        
    for count in res.keys():
        if count != 0:
            tmp.append((count,res[count]))
            
    #tmp.sort(key=lambda pair: pair[1])        
    
    n=len(tmp)
    for i in range(n-1):
        for j in range(i+1,n):
            if tmp[i][1]>tmp[j][1]:
                tmp[i],tmp[j]=tmp[j],tmp[i]
 
    strout=""
    for pair in tmp:
        strout=strout+str(pair[0])+" "+str(pair[1])+";"
    ls=len(strout)
    return strout[0:ls-1]
 
print(balans("prov.txt"))
1
2 / 1 / 1
Регистрация: 29.03.2022
Сообщений: 22
19.04.2022, 19:39  [ТС]
Catstail, Спасибо. Вместо создания нового списка - меняем значения местами в старом - все ок.
Но все-равно мне нужно найти ошибку в моем коде. Отсортировать не меняя алгоритм.
А за предложенные иные алгоритмы спасибо, задачу решают.

Добавлено через 49 минут
Ошибку нашел, переменная minn не менялась, т.к. не заканчивался while после завершения очередного for.
Ее нужно было объявить в теле цикла:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
out = ['123 -700', '456 -300', '789 -200']
outsort = []
while len(out):
    minn = '999 9999'
    for i in range(len(out)):
        if int(minn[4:]) > int(out[i][4:]):
            minn = out[i]
            i_minn = i
    outsort.append(minn)
    del out[i_minn]
    print(out)
 
print(outsort)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.04.2022, 19:39
Помогаю со студенческими работами здесь

Приложение для игры в монополию. Сохраняет имена игроков и их баланс в структуру. Позволяет изменять баланс
Дальше функции menu() дело не уходит. В чем ошибка? // Приложение должно считывать, выводить имя и баланс игрока в монополии, изменять...

Вычисляем приближённо интеграл
Задание делаю для совершенствования навыков своих, поэтому решения готового не прошу :) Мне только подсказать, как поступать? ...

Вычисляем сумму ряда
Нужно вычислить сумму ряда.Кто нибудь сталкивался с такой задачей?

Вычисляем последовательности Фибоначи
Где Ошибка //Автор: VibeProgramm // Задание взято из книги &quot;Страуструп принципы и практика использования c++&quot; Глава 5...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru